如何将带有嵌套 for 循环的函数转换为 Cudafy.Net
How to convert function with nested for-loops to 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 联系起来。
如果这是显而易见的事情,或者如果我没有准确描述我正在尝试做的事情,我深表歉意。只是对如何使嵌套循环正确感到困惑。感谢所有帮助我朝着正确方向前进的帮助。
这取决于lgeHeight和lgeWidth的大小。如果它们的乘积小于卡上的线程数,那么当您启动内核时,您可以假设每个线程将 运行 在一对 x 和 y 上。
lgDY = threadIdx.x
lgDX = blockIdx.x
然后你就可以一次全部计算出来了。如果线程数多于产品数,则需要将问题分成更小的部分或 运行 每个矩阵的小迭代。
我无法相信在我完成所有研究和阅读之后我仍然不是 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 联系起来。
如果这是显而易见的事情,或者如果我没有准确描述我正在尝试做的事情,我深表歉意。只是对如何使嵌套循环正确感到困惑。感谢所有帮助我朝着正确方向前进的帮助。
这取决于lgeHeight和lgeWidth的大小。如果它们的乘积小于卡上的线程数,那么当您启动内核时,您可以假设每个线程将 运行 在一对 x 和 y 上。
lgDY = threadIdx.x
lgDX = blockIdx.x
然后你就可以一次全部计算出来了。如果线程数多于产品数,则需要将问题分成更小的部分或 运行 每个矩阵的小迭代。