我不敢相信在我做了所有的研究和阅读之后,我仍然不是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,以及block size.x、block dim.x和threadsize.x,还有用于块的y和z。我很难理解,如果for语句消失了,我会用测试语句来代替它们,比如
if ( y < lgeHeight )
if ( x < lgeWidth )
...但是却不知道如何“将每个迭代绑定到一个递增的lgDY和lgDX。
如果这是显而易见的事情,或者如果我没有准确地描述我想要做的事情,我道歉。只是对如何使嵌套循环正确感到困惑。我感谢所有帮助我朝着正确方向前进的人。
发布于 2017-06-27 06:55:14
这取决于lgeHeight和lgeWidth的大小。如果它们的乘积小于卡上的线程数,那么当您启动内核时,您可以假设每个线程将在一对x和y上运行。
lgDY = threadIdx.x
lgDX = blockIdx.x然后你就可以一次把它们都计算出来。如果你有比产品更多的线程,那么你需要将问题分成更小的部分,或者对每个矩阵运行一次小的迭代。
https://stackoverflow.com/questions/44768344
复制相似问题