在cuda中从设备阵列获取单个元素的最佳方法是什么?

时间:2016-12-28 11:11:47

标签: cuda

我在一个巨大长度的设备上有一个数组,并且对于某些条件检查我想从中间访问(在主机/ CPU上)只有一个元素(比如第N个元素)。这可能是优化的方式。

我是否需要编写一个内核,将第N个位置写入src数组的单个元素数组中,然后将单个元素数组复制到主机?

2 个答案:

答案 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) );