在大型网格中执行可以执行任务的两个内核之间是否存在差异
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上创建内核是否有成本。
答案 0 :(得分:1)
内核的启动开销至少为几微秒。如果内核完成的工作非常小/很短,那么我预计第一种情况会花费更长时间。如果内核正在做大量的工作,差异应该是小的,百分比。
请注意,如果您想利用GPU的强大功能,<<<32,1>>>
和<<<64,1>>>
在网格配置中的选择非常糟糕。每个块只运行一个线程的网格(启动)配置可能会使超过95%的GPU功能未被使用。
答案 1 :(得分:1)
当在循环中(并在同一个流中)运行两个内核时,它们被序列化。也就是说,GPU必须在第二次启动之前完成第一次启动内核的所有计算。 GPU还必须在第二次启动之前将第一次启动写入的所有结果刷新到全局内存(因为CUDA保证内核写入的结果对后来的内核可见)。
如果你启动一个包含更多线程的内核,如果有容量,GPU可以自由地并行调度更多线程,并且有更多机会重用内核从全局内存中读取的值。
通常,内核启动开销可以忽略不计。