我的问题如下:
我希望以两种方式使用内核。
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];}
}
答案 0 :(得分:2)
double aDouble = 3;
double *myDouble = &double;
如果在主机代码中执行上述操作,则myDouble是指向主机内存的指针。这就是为什么你不能将它直接传递给设备内核(指针是一个指针,无论它指向一个数组还是一个标量值!)。
但是在CUDA 4.0中,您可以在主机指针上调用cudaHostRegister,如果您的系统支持unified virtual addressing,则可以将其传递给内核。如果没有,那么您可以使用适当的标志调用cudaHostRegister,然后cudaHostGetDevicePointer来获取可以传递给设备内核的指针。请参阅
上的CUDA文档