CUDA高效的内核调用

时间:2013-05-31 20:03:07

标签: cuda gpu

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

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

mykernel<<<128, 1>>>(myarray);
//or
mykernel<<<1, 128>>>(myarray);

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

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

3 个答案:

答案 0 :(得分:5)

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

mykernel<<<4, 32>>>(myarray);

但一般来说,您需要使用不同的参数对代码进行基准测试,以优化性能,YMMV。

答案 1 :(得分:0)

你是什么意思执行128次?如果你需要迭代数组128次并且每次迭代都取决于之前的结果,那么你需要将数组切成合理的部分并运行代码然后同步并重复。

一般情况下,如果你只有128个元素,那么在一个块中运行它们应该没问题,因为对内存的访问可能会更快。

答案 2 :(得分:0)

CUDA线程的最有效利用是32块。 这些被称为扭曲。

1 warp = 32个线程。

因此,请记住您的代码,并牢记这一点。