Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用多线程运行单个块,CUDA_C++_Cuda - Fatal编程技术网

C++ 使用多线程运行单个块,CUDA

C++ 使用多线程运行单个块,CUDA,c++,cuda,C++,Cuda,我知道,在CUDA上,每个块至少应该运行32个线程,因为线程是以32个线程为一组执行的。然而,我想知道只有一个块和一堆线程是否被认为是一种可接受的做法(我知道线程的数量是有限制的)。我这样问是因为我有一些问题,需要线程的共享内存和跨计算的每个元素的同步。我想像这样启动我的内核 computeSomething>(…) 只是用线程来做计算 只有一个块是有效的,还是我最好只在cpu上进行计算?如果你关心性能,这是个坏主意 主要原因是给定的threadblock只能占用GPU上单个SM的资源。由于大多

我知道,在CUDA上,每个块至少应该运行32个线程,因为线程是以32个线程为一组执行的。然而,我想知道只有一个块和一堆线程是否被认为是一种可接受的做法(我知道线程的数量是有限制的)。我这样问是因为我有一些问题,需要线程的共享内存和跨计算的每个元素的同步。我想像这样启动我的内核

computeSomething>(…)

只是用线程来做计算


只有一个块是有效的,还是我最好只在cpu上进行计算?

如果你关心性能,这是个坏主意

主要原因是给定的threadblock只能占用GPU上单个SM的资源。由于大多数GPU都有2条或更多短信,这意味着您将保持50%到90%的GPU性能不变

对于性能,这两种内核配置都不好:

kernel<<<1, N>>>(...);
内核(…);

内核(…);
第一个是你要问的案子。第二种情况是每个螺纹块有一个单螺纹;这使得大约97%的GPU马力保持不变

除了上述注意事项之外,GPU是延迟隐藏机器,并且喜欢有许多线程、扭曲和线程块可用,以从中选择工作,隐藏延迟。拥有大量可用线程有助于GPU隐藏延迟,这通常会导致更高的效率(每单位时间完成的工作)

很难说它在CPU上是否会更快。您必须进行基准测试和比较。如果所有数据都已在GPU上,并且您必须将其移回CPU来完成工作,然后将结果移回GPU,那么以相对低效的方式使用GPU可能会更快,以避免移动数据的开销

kernel<<<N, 1>>>(...);