【发布时间】:2021-08-27 07:06:43
【问题描述】:
我正在用 CUDA 做一些实验,我注意到启动相同的基本内核:
__global__
void add(int n, float *x, float *y)
{
int index = threadIdx.x;
int stride = blockDim.x;
for (int i = index; i < n; i += stride)
y[i] = x[i] + y[i];
}
与在不太大的数组上仅启动一个块(始终具有 512 个线程的块)相比,使用更多线程块有时会导致可执行文件的整体执行速度更慢。请注意,我一直在等待
在 CPU 上,这与创建线程的开销小于拥有更多线程所能产生的任何优势有关。
但是,在 GPU IIRC 上,我们没有通常意义上的线程,但我们只是拥有不同的物理内核,否则这些内核将不会被使用。我什至不认为这可能是内存问题,因为数据传输到 GPU 的时间没有改变,但也许我正在使用的统一内存正在做一些我不完全理解的事情。
所以我想知道:在 CUDA 中启动更多线程和线程块是否有更多开销?还是从 GPU 的角度发射 1 块或 128 块是一样的?
【问题讨论】:
-
试试/阅读这个:stackoverflow.com/questions/21332040/…(只需用总和替换演员表)。 for 循环的顺序会产生影响。
标签: c++ multithreading cuda gpu