C 多个内核和一个多维度内核之间的差异
为可以在大型网格中执行的任务调用两个内核有什么区别吗C 多个内核和一个多维度内核之间的差异,c,cuda,C,Cuda,为可以在大型网格中执行的任务调用两个内核有什么区别吗 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>&
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)
1。
for(int i=0;i(MatrixA,MatrixB)
}
2.
dim3 dimBlock(16,16);
dim3 dimGrid(1,1);
脚踏板>(MatrixA、MatrixB)
在Gpu上创建内核会有成本吗。内核的启动开销至少为几微秒。如果内核所做的工作非常小/短,那么我预计第一种情况需要更长的时间。如果内核所做的工作量很大,那么按百分比计算,差异应该很小
请注意,
和
如果要利用GPU的功能,在网格配置中是非常糟糕的选择。每个块仅运行一个线程的网格(启动)配置可能会使95%以上的GPU功能未使用。在循环中(在同一流中)运行两个内核时,它们被序列化。也就是说,GPU必须在第二次启动之前完成内核第一次启动的所有计算。GPU还必须在第二次启动之前将第一次启动写入的所有结果刷新到全局内存中(因为CUDA保证内核写入的结果对以后的内核可见)
如果您启动一个具有更多线程的内核,那么如果有容量,并且有更多机会重用内核从全局内存读取的值,那么GPU可以自由地并行调度更多线程
一般来说,内核启动的开销可以忽略不计。也许吧。试试看吧?