首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将带有嵌套for循环的函数转换为Cudafy.Net

如何将带有嵌套for循环的函数转换为Cudafy.Net
EN

Stack Overflow用户
提问于 2017-06-27 04:41:45
回答 1查看 237关注 0票数 1

我不敢相信在我做了所有的研究和阅读之后,我仍然不是100%清楚如何做到这一点,所以我必须问..我正在尝试让下面的代码在GPU卡上运行,并且我正在使用Cudafy.Net生成Cuda C等效项。我想让它尽可能快地运行。

如果我有一个函数(简化),如下所示:

代码语言:javascript
复制
Transform()
{
    for (lgDY = 0; lgDY < lgeHeight; lgDY++)
    {
        for (lgDX = 0; lgDX < lgeWidth; lgDX++)
        {
             // do a lot of stuff with lgDY and lgDX like stuff a matrix
        }
     }
}

我使用Launch()函数调用此函数,如下所示:

代码语言:javascript
复制
gpu.Launch(blocksize, threadsize, "Transform", args...)

我熟悉作为第一个参数传递的GThread,以及block size.x、block dim.x和threadsize.x,还有用于块的y和z。我很难理解,如果for语句消失了,我会用测试语句来代替它们,比如

代码语言:javascript
复制
if ( y < lgeHeight )
    if ( x < lgeWidth )
...

但是却不知道如何“将每个迭代绑定到一个递增的lgDY和lgDX。

如果这是显而易见的事情,或者如果我没有准确地描述我想要做的事情,我道歉。只是对如何使嵌套循环正确感到困惑。我感谢所有帮助我朝着正确方向前进的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-27 06:55:14

这取决于lgeHeight和lgeWidth的大小。如果它们的乘积小于卡上的线程数,那么当您启动内核时,您可以假设每个线程将在一对x和y上运行。

代码语言:javascript
复制
lgDY = threadIdx.x
lgDX = blockIdx.x

然后你就可以一次把它们都计算出来。如果你有比产品更多的线程,那么你需要将问题分成更小的部分,或者对每个矩阵运行一次小的迭代。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44768344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档