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

在cuda中,从设备阵列获取单个元素的最佳方式是什么,cuda,Cuda,我在设备上有一个非常长的数组,对于某些条件检查,我只想访问(在主机/CPU上)中间的一个元素(比如第n个元素)。这样做的最佳方式是什么 我是否需要编写一个内核,从src数组在单元素数组中写入第n个位置,然后将单元素数组复制到主机 您可以使用cudaMemcpy复制数组的单个元素。 假设您要复制数组的第N个元素: int*dSourceArray 变 int-hTargetVariable 您可以在主机上应用设备指针算法。您只需将dSourceArray指针按N元素移动,然后复制单个元素: cud

我在设备上有一个非常长的数组,对于某些条件检查,我只想访问(在主机/CPU上)中间的一个元素(比如第n个元素)。这样做的最佳方式是什么


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

您可以使用
cudaMemcpy
复制数组的单个元素。 假设您要复制数组的第N个元素:

int*dSourceArray

int-hTargetVariable

您可以在主机上应用设备指针算法。您只需将
dSourceArray
指针按
N
元素移动,然后复制单个元素:

cudaMemcpy(&hTargetVariable, dSourceArray+N, sizeof(int), cudaMemcpyDeviceToHost)

请记住,如果您使用多个流,您希望在传输数据之前同步设备。

您可以使用
cudaMemcpy
复制阵列的单个元素。 假设您要复制数组的第N个元素:

int*dSourceArray

int-hTargetVariable

您可以在主机上应用设备指针算法。您只需将
dSourceArray
指针按
N
元素移动,然后复制单个元素:

cudaMemcpy(&hTargetVariable, dSourceArray+N, sizeof(int), cudaMemcpyDeviceToHost)

请记住,如果使用多个流,您希望在传输数据之前同步设备。

答案1的一个附录,您可能需要考虑数组中每个元素的字节数。e、 g.对于设备上各种类型的阵列阵列:

#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) );

答案1的附录中,您可能需要考虑数组中每个元素的字节数。e、 g.对于设备上各种类型的阵列阵列:

#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) );

这难道不意味着主机已经知道N了吗?如果不是,会发生什么?如果N是在设备上计算的,那么使用一些全局设备变量就可以了。首先,您将使用cudaMemcpyFromSymbol()从全局设备变量复制N的值,然后如上所述将N复制到元素中。这是否意味着主机已经知道N?如果不是,会发生什么?如果N是在设备上计算的,那么使用一些全局设备变量就可以了。首先,您将使用cudaMemcpyFromSymbol()从全局设备变量复制N值,然后如上所述将N值复制到元素中。