我一直在尝试分配一个可以被每个内核函数访问的变量。 我的尝试是下面附带的代码,但它不会编译,因为内核无法访问dArray。在C ++中,您可以将变量置于顶部,或者在整个程序中声明要在每个范围内访问静态。
__global__ void StoreThreadNumber()
{
dArray[threadIdx.x] = threadIdx.x;
}
int main( int argc, char** argv)
{
unsigned __int8 Array[16] = { 0 };
unsigned __int8 dArray[16];
for( __int8 Position = 0; Position < 16; Position++)
cout << Array[Position] << " ";
cout << endl;
cudaMalloc((void**) dArray, 16*sizeof(__int8));
cudaMemcpy( dArray, Array, 16*sizeof(__int8), cudaMemcpyHostToDevice);
StoreThreadNumber<<<1, 16>>>();
cudaMemcpy( Array, dArray, 16*sizeof(__int8), cudaMemcpyDeviceToHost);
for( __int8 Position = 0; Position < 16; Position++)
cout << Array[Position] << " ";
cout << endl;
cudaFree(dArray);
}
答案 0 :(得分:5)
您可以在CUDA中使用__device__
或__constant__
类型的全局变量。因此,例如,如果使用__constant__
将cudaMemcpyToSymbol()
指针变量初始化为设备指针的地址,则可以通过__constant__
变量访问该指针:
__constant__ int* dArrayPtr;
__global__ void StoreThreadNumber()
{
dArrayPtr[threadIdx.x] = threadIdx.x;
}
在运行内核之前,请确保从主机代码中正确初始化dArrayPtr。
答案 1 :(得分:2)
你做不到。您必须将指向dArray的指针传递给内核。
我有同样的问题,必须将大量的全局数据传递给gpu。我最终将它全部包装在一个结构中并传递指向它的指针。