从设备功能访问大数据文件

时间:2016-04-29 08:50:08

标签: cuda

需要从设备功能访问大型数据文件(具有1000000行和2列)。在计算的每个步骤中,变量的值在设备函数中改变,并且需要数据文件的特定行的值。因此整个数据文件应该在设备功能中可用,因为在每一步都无法控制变量的值。

在以下程序中,变量的值从设备函数发送到主机设备函数,然后变量从主机设备函数发送到主机功能(数据文件可用)。主机函数从整个数组中获取所需的值,这样可以在设备函数中获得一个特定步骤所需的值。但是这个过程不适用于代码。

我不知道关键字__host__ __device__是否适用于cuda V0.2.1221。

请建议一种在设备功能中识别大数据文件的方法。

下面给出了代码的必要部分。

__host__
void magnetic( R *xx, R *magfield)
{
  float Bx[1000001],By[1000001];
  R x[3];
  int k;
  FILE *fp; 
  fp = fopen("field.dat", "r");
  for (int i=0;i<=1000000;i++)
  {
  fscanf(fp, "%f%f", &Bx[i], &By[i]);
  } 
  fclose(fp);
  printf("%f\t%f\n",Bx[0],By[0]);

  for( int i=0;i<3;i++){
  x[i]=*xx;
  xx++;
  }
  //printf("%f\t%f\t%f\n",x[0],x[1],x[2]);
  k=round((zi+x[2])/dz);
  magfield[0]=Bx[k];
  magfield[1]=By[k];
  magfield[2]=2.;
}
__host__
void magnetic(R *xx, R *magfield);

__host__ __device__
void field(R *xx, R *magfield){
  R x[3];
  for( int i=0;i<3;i++){
  x[i]=*xx;
  xx++;
  }
 magnetic(x,magfield);
}

__host__ __device__
void field( R *xx, R *magfield);

__device__
void eval_rhs(  R *f, R *df, R time, int istep) {
R magfield[3],vXB[3];
df[0] = f[3];
df[1] = f[4];
df[2] = f[5];

field( &f[0], magfield);

    crossmultiply(&f[3], magfield, vXB);

    df[3] = Ex +  vXB[0];
    df[4] = Ey +  vXB[1];
    df[5] = Ez +  vXB[2];

}

1 个答案:

答案 0 :(得分:1)

问题: 请建议一种在设备功能中识别大数据文件的方法。

答案: 在主机端加载文件,将缓冲区从系统内存复制到设备内存,然后在内核和/或设备功能中使用此设备端缓冲区。

int main()
{
    FILE* file;
    float* fileData;

    ... // Allocate buffer here

    ... // Open and load file here

    float* dev_fileData;
    cudaMalloc(/*allocate the same-sized array on device side*/);
    cudaMemcpy(/*copy from host-side fileData to device-side*/);

    kernel<<<blocks, threads>>>(dev_fileData);

    system("pause");
    return 0;
}

__device__ void doSomething(float* dev_fileData)
{
    // Read (and/or write, but avoid concurrent access) data here
}

__global__ void kernel(float* dev_fileData)
{
    // Some kernel code

    doSomething(dev_fileData);

    // Some other kernel code
}