您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

为什么我不能用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.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])

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

python 2022/1/1 18:46:13 有300人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶