我在一个巨大长度的设备上有一个数组,并且对于某些条件检查我想从中间访问(在主机/ CPU上)只有一个元素(比如第N个元素)。这可能是优化的方式。
我是否需要编写一个内核,将第N个位置写入src数组的单个元素数组中,然后将单个元素数组复制到主机?
答案 0 :(得分:1)
您可以使用cudaMemcpy
复制数组的单个元素。
假设您要复制N
- 数组的元素:
int * dSourceArray
变量
int hTargetVariable
您可以在主机上应用设备指针算术。您需要做的就是将dSourceArray
指针移动N
元素蚂蚁复制单个元素:
cudaMemcpy(&hTargetVariable, dSourceArray+N, sizeof(int), cudaMemcpyDeviceToHost)
请记住,如果您使用多个流,则需要在传输数据之前同步设备。
答案 1 :(得分:0)
一个回答1的附录,您可能需要考虑数组中每个元素的字节数。例如对于设备上各种类型的数组的数组:
#ifdef CUDA_KERNEL
char* mgpu[ MAX_BUF ]; // Device array of pointers to arrays of various types.
#else
CUdeviceptr mgpu[ MAX_BUF ]; // on host, gpu is a device pointer.
CUdeviceptr gpu (int n ) { return mgpu[n]; }
CUdeviceptr GPUpointer = m_Fluid.gpu(FGRIDOFF); // Device pointer to FGRIDOFF (int) array
cuMemcpyDtoH (&CPUelement, GPUpointer+(offset*sizeof(int)) , sizeof(int) );