我需要使用一个整数 (0-99) 作为参数,使用相同的数据运行我的 GPU 内核(ALEA 库)100 次。我试图在内核中实现这个循环,但我得到了奇怪的结果。我必须将循环从内核中取出并围绕 GPULaunch 函数,如下所示:
var lp = new LaunchParam(GridDim, BlockDim);
for (int i= 0; i < 100; i++)
{
GPULaunch(TestKernel, lp, Data, i);
}
代码的 CPU 版本经过高度优化,高效使用 4 个内核 (%100)。根据合并的内存访问原则重新组织内存中的数据后,我可以获得 %92 的占用率和 %96 的全局负载效率。但是,GPU 版本仅比 CPU 版本快 %50。我怀疑以这种方式循环 GPULaunch 是否有效。
正如您在下图中看到的,我没有在 NVIDIA Visual Profiler 中看到重复的内存传输。一旦我将数据加载到 GPU(图中看不到,但对我来说并不重要),我会得到 100 个循环输出的短暂内存传输,如右端所示。所以我的问题是:
- 这种在循环中调用 GPULaunch 的方法是否对相同数据进行了看不见的内存传输?
- 如果有这样的开销,我需要在内核中有这个循环。我该怎么做。我试过但结果不稳定,认为这种方法不适合 GPU 并行编程架构。
提前致谢