⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitvector.h

📁 用于GPU通用计算的编程语言BrookGPU 0.4
💻 H
字号:
#ifndef BITVECTOR_H
#define BITVECTOR_H

#include "Types.h"
#include <stdio.h>
#include <stdlib.h>

#define WORDSIZE 64

class BitVector{
public:
  BitVector( const Tuple3i& dimensions, int C ) {
    dims = dimensions;
    dims.x += (C-dims.x%C);
    dims.y += (C-dims.y%C);
    dims.z += (C-dims.z%C);
    num_entries = dims.x*dims.y*dims.z;
    num_elements = num_entries/WORDSIZE + 1;
    if(num_entries <= 0){
      fprintf(stderr, "Bad BVector size: %ix%ix%i\n", dims.x, dims.y, dims.z);
      exit(0);
    }
    elements = new u64[num_elements];
    for(int i=0; i<num_elements; i++)
      elements[i] = (u64)0;

    //initialize LUTs
    G = new int[dims.x];
    H = new int[dims.y];
    I = new int[dims.z];
    for(int u=0; u<dims.x; u++)
      G[u] = (u/C)*C*C*C + u%C;
    for(int v=0; v<dims.y; v++)
      H[v] = (v/C)*(dims.x/C)*C*C*C + (v%C)*C;
    for(int w=0; w<dims.z; w++)
      I[w] = (w/C)*(dims.x/C)*(dims.y/C)*C*C*C + (w%C)*C*C;
  }

  ~BitVector(){
    delete [] elements;
    delete [] G;
    delete [] H;
    delete [] I;
  }

  void Set(int u, int v, int w) {
    int index = G[u]+H[v]+I[w];
    int position = index / WORDSIZE;
    int offset = index % WORDSIZE;
    u64 value = (u64)1 << offset;
    elements[position] = elements[position] | value;
  }

  bool Check(int u, int v, int w){
    //#ifdef STREAM
    bool validindex = u < dims.x && v < dims.y && w < dims.z;
    int index = validindex ? G[u]+H[v]+I[w] : 0;
    int position = index / WORDSIZE;
    int offset = index % WORDSIZE;
    u64 value = (u64)1 << offset;
    return ( validindex && (elements[position] & value) != (u64)0 );
    //#else
    //int index = G[u]+H[v]+I[w];
    //int position = index / WORDSIZE;
    //int offset = index % WORDSIZE;
    //u64 value = (u64)1 << offset;
    //return ( (elements[position] & value) != (u64)0 );
    //#endif
  }

  int GetPosition(int u, int v, int w){
    int index = G[u]+H[v]+I[w];
    int position = index / WORDSIZE;
    return position;
  }

  u64 GetWord(int u, int v, int w){
    int index = G[u]+H[v]+I[w];
    int position = index / WORDSIZE;
    return elements[position];
  }

  void DumpList(){
    for(int i=0; i<num_elements; i++){
      if(elements[i])
	fprintf(stderr, "Element %i has data\n", i);
      else
	fprintf(stderr, "Element %i is empty\n", i);
    }
  }

  void WriteToFile(FILE *fp){
    fwrite( elements, sizeof(u64), num_elements, fp );
  }

  void ReadFromFile(FILE *fp){
    fread( elements, sizeof(u64), num_elements, fp );
  }
  
private:
  u64 *elements;
  int num_elements;
  int num_entries;
  //lookup tables
  int *G, *H, *I;
  Tuple3i dims;
};

#endif /* BITVECTOR_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -