我是 CUDA 的新手,想了解更多关于优化内核启动条件以加快我的代码的信息。这是一个非常具体的场景,但我会尽量概括它,以便将来有类似问题的任何人都可以从中受益。
假设我有一个包含 300 个元素的数组(数组 A)作为输入发送到内核。这个数组由几个重复的整数组成,每个整数都有一个特定的设备函数。例如,数组 A 中每次出现 5 时,内核执行特定于 5 的函数。这些函数是设备函数。
我如何并行化这个问题是通过启动 320 个块(可能不是最佳数量),以便每个块将并行执行与其元素相关的设备功能。
CPU 将以串行方式处理整个问题,它将逐个元素地调用每个函数,而 GPU 将为每个块分配一个元素,以便所有 320 个块都可以访问相关的设备函数并同时计算.
理论上,对于大量元素,GPU 应该更快——至少我是这样,但在我的情况下不是。我的假设是,由于 300 个元素是一个很小的数字,CPU 总是比 GPU 快。
这是可以接受的,但我想知道的是如何将 GPU 执行时间至少减少一点。目前,CPU 需要 2.5 毫秒,GPU 大约需要 12 毫秒。
问题 1 - 我如何选择一开始就启动的最佳块/线程数?首先,我尝试了 320 个块,每个块有 1 个线程。然后是 1 个具有 320 个线程的块。执行时间没有真正的变化。调整块/线程的数量会提高速度吗?
问题 2 - 如果 300 个元素太小,为什么会这样?大约需要多少个元素才能看到 GPU 优于 CPU?
问题 3 - 我应该研究哪些优化技术?
如果有任何不清楚的地方,请告诉我,我会对此进行扩展。
提前致谢。