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