Python 提高元素级CUDA内核运算强度的技术

Python 提高元素级CUDA内核运算强度的技术,python,cuda,cupy,Python,Cuda,Cupy,我编写了一个CUDA内核,用于计算一组源粒子和目标粒子之间的成对相互作用 我的M目标粒子看起来像 [[x_1,y_1,z_1],...,[x_m, y_m, z_m]] 我的N源粒子看起来像 [[x_1,y_1,z_1],...,[x_n, y_n, z_n]] M

我编写了一个CUDA内核,用于计算一组源粒子和目标粒子之间的成对相互作用

我的M目标粒子看起来像

[[x_1,y_1,z_1],...,[x_m, y_m, z_m]]
我的N源粒子看起来像

[[x_1,y_1,z_1],...,[x_n, y_n, z_n]]
M 首先,我将所有源/目标数据传输到GPU,循环处理成批的源粒子,并评估与所有目标的成对交互

像这样(用cupy语法)

范围内i的
(n_块):
左_idx=i*width
右_idx=(i+1)*宽度
gpu函数(
网格尺寸、块尺寸、目标、,
源[left_idx:right_idx,:],宽度
)
其中
目标
是GPU上包含源和目标数据的数组

我的问题是,我必须做些什么来避免这种循环?我是CUDA的新手。我的想法是检查每个线程的全局线程索引是否满足我在主机设备循环中得到的“left_idx”和“right_index”条件,是否正确?有更好的方法吗?我觉得我目前对GPU的利用严重不足,因为我的问题源/目标数量明显少于我机器上的CUDA内核数量

我的问题是,我必须做些什么来避免这种循环?我是CUDA的新手

并行编程(CUDA或其他)中的一个基本概念是,不让循环在时间上连续发生,而是让不同的处理元素/线程/自动机/任何东西在所有“循环迭代”上并行工作:N个处理元素每个做1件工作,而不是1个处理元素使用循环执行N个工作

在CUDA中,对于M和N,这可能意味着有一个M x N的2D网格,每个CUDA线程处理一对源和目标粒子集。或者更小的网格,每个CUDA线程在多个对上运行一个循环,但对更少

您可能还记得CUDA vectorAdd示例,它计算两个向量的元素相加。这里有一个可能的内核:

__global__ void vecAdd(int *A, int *B, int *C, int N)
{
   int i = blockIdx.x * blockDim.x + threadIdx.x;
   C[i] = A[i] + B[i]; 
}

看到了吗?没有任何循环。网格中的大量线程确保每个可能的i(介于0和N-1之间)都计算了相应的C元素。

建议如何增加内核的算术强度需要了解内核。对内核的一句话描述不足以提供这样的建议。代码问题