栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/633812.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号