您没有得到期望的总和的原因是因为您尚未编写代码来产生该总和。
基本的CUDA编程模型(无论您使用CUDA C,Fortran还是Python作为语言)都是编写由每个线程执行的内核代码。您已经为每个线程编写了代码,以读取和求和输入数组的一部分。您尚未编写任何代码来使这些线程共享和将其各个部分总和求和为最终总和。
有一个 非常 好的描述算法可以做到这一点- 称为并行约简。您可以在CUDA工具包的每个版本的示例中附带的PDF中找到该算法的简介,或在此处下载有关该算法的演示文稿。您还可以阅读其采用CUDA的新功能(经整理指令和原子交易)的算法更现代的版本在这里。
研究完归约算法后,您需要将标准CUDA C内核代码改编为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])
尽管距离最佳并行共享内存的减少还有很长的路要走,但是阅读完我提供的链接资料后,您会发现,这可能会做您想要的事情。