CUDA高效的内核调用

Pri*_*alj 2 cuda gpu

伙计们请确认我的想法是否正确.

假设我有一个内核函数mykernel(double *array).我希望内核中的代码执行128次.从主机调用内核时,我可以通过两种方式执行此操作:

mykernel<<<128, 1>>>(myarray);
//or
mykernel<<<1, 128>>>(myarray);
Run Code Online (Sandbox Code Playgroud)

通过第一次调用,我将创建128个块,每个块运行1个线程.在第二次调用中,我将创建一个包含128个线程的块.但由于内核中的代码在同一个数组上运行,因此使用第二次调用更有效.

我是个傻瓜,还是应该坚持学习CUDA?:)

小智 5

这取决于.第一次调用将创建多个块,但每个块都太小而无法有效地使用GPU的多处理器(它们甚至小于warp大小).第二次调用不会使用GPU上的多个多处理器.如果你真的只需要128个线程,那么我建议你尝试一下

mykernel<<<4, 32>>>(myarray);
Run Code Online (Sandbox Code Playgroud)

但通常你需要使用不同的参数对代码进行基准测试,以优化性能,YMMV.

  • 谢谢你的解释.我忘记在我的回答中提出另一个问题:我是否需要将简单变量(例如int)复制到设备,方法与数组相同? (2认同)