你没有得到你所期望的总数是因为你没有写信 代码生成那个总和。 基本的CUDA编程模型(无论您是使用cudac、Fortran还是Python作为 你的语言)是你编写内核代码,由每个线程执行。 您已经为每个线程编写了代码来读取和求和输入数组的一部分。 您还没有为这些线程编写任何代码来共享和求和它们的 个别部分和变成最终和。 有一个非常好的算法来实现这一点——它是 称为平行还原。您可以在中找到该算法的介绍 在CUDA工具包的每个版本的示例中提供的PDF,或 下载相关演示文稿这里. 你也可以阅读一个更现代版本的算法,它使用了更新的 CUDA的特点(warp-shuffle指令和原子事务) [这里](https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions- 开普勒/)。 在学习了约简算法之后,您将需要调整 将标准cudac内核代码转换成Numba Python内核方言。光秃秃的 最低限度,类似这样:
tpb = (1,3)
@cuda.jit
def calcu_sum(D,T):
ty = cuda.threadIdx.y
bh = cuda.blockDim.y
index_i = ty
sbuf = cuda.shared.array(tpb, float32)
L = len(D)
su = 0
while index_i < L:
su += D[index_i]
index_i +=bh
print('su:',su)
sbuf[0,ty] = su
cuda.syncthreads()
if ty == 0:
T[0,0] = 0
for i in range(0, bh):
T[0,0] += sbuf[0,i]
print('T:',T[0,0])
可能会做你想做的事,尽管离成功还有很长的路要走 最佳的并行共享内存减少,当您阅读 我提供链接的材料。