伙计们请确认我的想法是否正确。
假设我有一个内核函数mykernel(double *array)
。我希望内核中的代码执行128次。从主机调用内核时,我可以通过两种方式执行此操作:
mykernel<<<128, 1>>>(myarray);
//or
mykernel<<<1, 128>>>(myarray);
首次调用时,我将创建128个块,每个块运行1个线程。在第二次调用中,我将创建一个包含128个线程的块。但由于内核中的代码在同一个数组上运行,因此使用第二次调用会更有效。
我是个傻瓜,还是应该坚持学习CUDA? :)
答案 0 :(得分:5)
这取决于。第一次调用将创建多个块,但每个块都太小而无法有效地使用GPU的多处理器(它们甚至比warp大小更小)。第二次调用不会使用GPU上的多个多处理器。如果你真的只需要128个线程,那么我建议你尝试一下
mykernel<<<4, 32>>>(myarray);
但一般来说,您需要使用不同的参数对代码进行基准测试,以优化性能,YMMV。
答案 1 :(得分:0)
你是什么意思执行128次?如果你需要迭代数组128次并且每次迭代都取决于之前的结果,那么你需要将数组切成合理的部分并运行代码然后同步并重复。
一般情况下,如果你只有128个元素,那么在一个块中运行它们应该没问题,因为对内存的访问可能会更快。
答案 2 :(得分:0)
CUDA线程的最有效利用是32块。 这些被称为扭曲。
1 warp = 32个线程。
因此,请记住您的代码,并牢记这一点。