需要从设备功能访问大型数据文件(具有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];
}
答案 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
}