Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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 |对多处理器数量的兴趣-与SMs混淆_C++_Cuda - Fatal编程技术网

C++ CUDA |对多处理器数量的兴趣-与SMs混淆

C++ CUDA |对多处理器数量的兴趣-与SMs混淆,c++,cuda,C++,Cuda,我有一台NVIDIA GT650M,具有以下特性: ( 2) Multiprocessors, (192) CUDA Cores/MP: 384 CUDA Cores Maximum number of threads per multiprocessor: 2048 我刚刚摆脱了流式多处理器(SM)和实际多处理器之间的混淆。SMs和多处理器是不同的东西,对吗? 例如,使用VisualProfiler,我得到了一个虚拟内核,当使用1块1线程启动时,它只等待并持续370ms。 我可以用

我有一台NVIDIA GT650M,具有以下特性:

( 2) Multiprocessors, (192) CUDA Cores/MP:     384 CUDA Cores
Maximum number of threads per multiprocessor:  2048
我刚刚摆脱了流式多处理器(SM)和实际多处理器之间的混淆。SMs和多处理器是不同的东西,对吗? 例如,使用VisualProfiler,我得到了一个虚拟内核,当使用1块1线程启动时,它只等待并持续370ms。 我可以用4块1024个线程和一个SM启动它,它仍然持续370ms。这是正常的,因为任务使用芯片的2个多处理器,每个处理器使用2048个并发线程(只要我使用5个块x1024,就需要740ms,正常)。 类似地,我可以使用4条SMs同时启动4次1024个线程块,这仍然需要370ms,ok

问题的第一部分只是为了确保我们不应该混淆SMs和多处理器?就像我有时在这里看到的答案: 因此,无法通过多处理器显式控制任务的调度方式,因为(据我所知)没有运行时函数允许这样做,对吗?那么,如果我有一个卡,每个多处理器有2个多处理器和2048个线程,或者另一个卡有4个多处理器,每个多处理器有1024个线程,那么给定的程序将以相同的方式执行


第二,我想知道什么是更好的使用,有更多的多处理器和很少的核心,还是相反?到目前为止,我的理解让我说,更多的多处理器(对于给定的每个多处理器的最大线程数)和更少的内核将更适合于使用更少/简单操作的大规模并行,而每个多处理器有更多的内核(现在我谈论的是我几乎不知道的事情)将有更多专用的ALU用于加载/存储操作和复杂的数学函数,因此它将更适合每个线程需要更多操作的内核?

这似乎是术语上的混淆

“SM”(SM=流式多处理器)和“多处理器”指的是同一事物,是GPU上的主要执行单元的硬件单元。这些术语指的是特定的硬件资源。不同的GPU可能有不同数量的SMs。使用CUDA
deviceQuery
,可以找到特定GPU的SMs数量:

cudaDeviceProp-deviceProp;
CudaGetDeviceProperty(&deviceProp,0);//第0设备

coutSM和多处理器是一回事。没有API函数可以控制SMs上线程块的调度。整个问题似乎是一篇基于简单误解的毫无意义的论文。如果视频卡属性中给出了SMs和多处理器,那么为什么说只有两个多处理器,我能同时发送更多短信吗?你不能发送短信。SM是一种硬件。你启动一个线程块;实际上,您启动了由内核启动指定的线程块集合。您可以在内核中启动大量线程块,这或多或少与您运行的GPU无关。然后,线程块将以特定GPU及其SMs提供的任何速率进行处理。好的,谢谢您的澄清!
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, 0); // 0-th device
std::cout << deviceProp.multiProcessorCount;