我想在运行时在设备内存中声明一个可由所有设备函数访问的全局范围数组。执行以下操作可以满足编译器:
__device__ float *g_array;
但是,我现在正在cudaMemcpy
和cudaMalloc
收到编译器警告我正在从主机功能访问设备变量。我认为我需要获取实际的设备地址,所以我尝试了cudaGetSymbolAddress
但是我得到Invalid device symbol error
。
这基本上就是我想做的事情:
__device__ float *g_array;
__constant__ int N;
__global__ void device_add_one()
{
for (int index = blockIdx.x * blockDim.x + threadIdx.x;
index < N;
index += blockDim.x * gridDim.x)
{
g_array[index] += 1;
{
}
void init_arrays(float *host_array, int size)
{
cudaMalloc(&g_array, (size * sizeof(float));
cudaMemcpy(g_array, host_array, (size * sizeof(float)), cudaMemcpyHostToDevice);
cudaMemcpyToSymbol(N, &size, sizeof(N));
device_add_one<< < 1, 254>> >();
cudaMemcpy(host_array, g_array, (size * sizeof(float), cudaMemcpyDeviceToHost);
}
注意:必须使用可计算性2.0