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

时间:2017-06-26 20:41:45

标签: cuda gpu gpu-programming cudafy.net

我无法相信在完成所有的研究和阅读之后,我仍然没有100%明白如何做到这一点,所以我必须要问...我试图得到类似以下的内容来运行gpu卡和我使用Cudafy.Net生成Cuda C等价物。我想让它尽快运行。

如果我有一个功能(简化),例如:

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()函数调用它,如下所示:

gpu.Launch(blocksize, threadsize, "Transform", args...)

我熟悉作为第一个参数传递的GThread,以及blocksize.x,blockdim.x和threadsize.x,以及块的y和z。我很难理解for语句是否消失了,我用类似

的测试替换它们
if ( y < lgeHeight )
    if ( x < lgeWidth )
...

但后来却不知道如何“将每次迭代与递增的lgDY和lgDX联系起来。

我道歉,如果它显然是显而易见的,或者我没有描述我想要准确做的事情。只是混淆了如何使嵌套循环正确。我感谢任何帮助,让我朝着正确的方向前进。

1 个答案:

答案 0 :(得分:1)

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

lgDY = threadIdx.x
lgDX = blockIdx.x

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