0

为可以在大型网格中执行的任务调用两个内核是否有区别

1.
for(int i=0;i<2;i++)
{
   dim3 dimBlock(16, 8);
   dim3 dimGrid(1,1);
   FooTask<<dimGrid,dimBlock>>>(MatrixA,MatrixB)
}
2.
dim3 dimBlock(16, 16);
dim3 dimGrid(1,1);
FooTask<<dimGrid,dimBlock>>>(MatrixA,MatrixB)

在 Gpu 上创建内核是否有成本。

4

2 回答 2

1

内核的启动开销至少为几微秒。如果您的内核完成的工作非常小/短,那么我预计第一种情况需要更长的时间。如果内核正在做大量工作,则差异应该很小,按百分比计算。

请注意,如果您想利用 GPU 的强大功能,那么<<<32,1>>>和在网格配置中是非常糟糕的选择。<<<64,1>>>每个块仅运行一个线程的网格(启动)配置可能会留下超过 95% 的 GPU 功能未使用。

于 2013-09-19T19:17:49.767 回答
1

当在一个循环中(并且在同一个流中)运行两个内核时,它们会被序列化。也就是说,GPU 必须在第二次启动之前完成内核第一次启动的所有计算。GPU 还必须在第二次启动之前将第一次启动写入的所有结果刷新到全局内存中(因为 CUDA 保证内核写入的结果对以后的内核可见)。

如果您启动具有更多线程的单个内核,则 GPU 可以在有容量的情况下自由地并行调度更多线程,并且有更多机会重用内核从全局内存中读取的值。

通常,内核启动开销可以忽略不计。

于 2013-09-19T20:40:50.930 回答