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