CUDA 4.0使用内核中的指针 - 错误

时间:2011-08-07 18:45:42

标签: pointers cuda gpu

我的问题如下:

我希望以两种方式使用内核。

  • 我使用已使用d_array复制的数组cudaMemcpy,即通过

cutilSafeCall(cudaMemcpy(d_array, array,  100*sizeof(double),
                         cudaMemcpyHostToDevice));

或者

  • 我直接输入了一个mydouble double mydouble = 3;

如果我输入数组,我只需使用(工作正常):

kernel<<<1, 100>>>(d_array, 100, output);

如果我输入一个双用的(工作正常!!!!):

kernel<<<1, 100>>>(&mydouble, 1, output);

我的内核列在下面:

___global___ void kernel(double * d_array, int size_d_array, double * output)
{
  double a;

  if (size_d_array == 100) 
    {output[threadIdx.x] = d_array[threadIdx.x];}

  else
    {output a[threadIdx.x] = d_array[0];} 
}

1 个答案:

答案 0 :(得分:2)

double aDouble = 3;
double *myDouble = &double;

如果在主机代码中执行上述操作,则myDouble是指向主机内存的指针。这就是为什么你不能将它直接传递给设备内核(指针是一个指针,无论它指向一个数组还是一个标量值!)。

但是在CUDA 4.0中,您可以在主机指针上调用cudaHostRegister,如果您的系统支持unified virtual addressing,则可以将其传递给内核。如果没有,那么您可以使用适当的标志调用cudaHostRegister,然后cudaHostGetDevicePointer来获取可以传递给设备内核的指针。请参阅

上的CUDA文档