为什么我不能用numba(cuda python)获得1D数组的正确和?

为什么我不能用numba(cuda python)获得1D数组的正确和?,第1张

为什么我不能用numba(cuda python)获得1D数组的正确和?

你没有得到你所期望的总数是因为你没有写信
代码生成那个总和。
基本的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])

可能会做你想做的事,尽管离成功还有很长的路要走
最佳的并行共享内存减少,当您阅读
我提供链接的材料。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5639683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存