【发布时间】:2023-11-02 07:00:01
【问题描述】:
我编写了一个 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语法中)
for i in range(n_blocks):
left_idx = i*width
right_idx = (i+1)*width
gpu_func(
grid_dimensions, block_dimensions, targets,
sources[left_idx:right_idx,:], width
)
其中sources 和targets 是GPU 上包含源数据和目标数据的数组。
我的问题是我必须做些什么来避免这个循环?我是 CUDA 的新手。我的想法是检查来自每个线程的全局线程索引是否满足我在主机设备循环中的“left_idx”和“right_index”条件,这是正确的吗?有没有更好的方法来做到这一点?我觉得我目前对 GPU 的利用严重不足,因为源/目标的数量明显少于我机器上的 CUDA 核心数量。
【问题讨论】:
-
建议如何增加核的算术强度需要核的知识。对内核的一句话描述不足以提供这样的建议。代码很重要