2

请各位大侠确认一下我的想法是否正确。

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

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

第一次调用时,我将创建 128 个块,每个块运行 1 个线程。在第二次调用中,我将创建 1 个具有 128 个线程的块。但是由于内核内部的代码在同一个数组上工作,所以使用第二次调用效率更高。

我是傻子还是应该坚持学习CUDA?:)

4

3 回答 3

5

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

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

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

于 2013-05-31T20:13:25.650 回答
1

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

1 经线 = 32 线程。

因此,请记住这一点,对您的代码进行建模。

于 2013-05-31T20:19:58.430 回答
0

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

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

于 2013-05-31T20:16:45.700 回答