Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading Openmp线程分歧?_Multithreading_Cuda_Openmp - Fatal编程技术网

Multithreading Openmp线程分歧?

Multithreading Openmp线程分歧?,multithreading,cuda,openmp,Multithreading,Cuda,Openmp,CUDA中使用了“线程发散”一词;据我所知,这种情况下,不同的线程被分配执行不同的任务,这会对性能造成很大影响 我想知道,在openmp中这样做是否会受到类似的惩罚?例如,假设我有一个6核处理器和一个有6个线程的程序。如果我有一个条件,使3个线程执行某个任务,然后让其他三个线程执行一个完全不同的任务,会有很大的性能影响吗?我猜本质上是用openmp做MIMD 基本上,我正在用openmp和CUDA编写一个程序。我希望两个线程运行CUDA内核,而其他剩余线程运行C代码。谢谢。不,使用OpenMP的

CUDA中使用了“线程发散”一词;据我所知,这种情况下,不同的线程被分配执行不同的任务,这会对性能造成很大影响

我想知道,在openmp中这样做是否会受到类似的惩罚?例如,假设我有一个6核处理器和一个有6个线程的程序。如果我有一个条件,使3个线程执行某个任务,然后让其他三个线程执行一个完全不同的任务,会有很大的性能影响吗?我猜本质上是用openmp做MIMD


基本上,我正在用openmp和CUDA编写一个程序。我希望两个线程运行CUDA内核,而其他剩余线程运行C代码。谢谢。

不,使用OpenMP的不同线程不会对性能造成影响。这在CUDA中是一个问题,因为指令同时广播到一组内核的方式。当OpenMP线程以CPU内核为目标时,每个CPU内核都有自己的独立指令集要遵循,并且它的运行方式与任何其他单线程程序一样


如果线程发散后出现了同步障碍,您可能会看到一些内核没有得到充分利用,因为这会迫使更快的线程等待较慢的线程赶上。当谈到CPU并行性时,使用特定的线程设计模式不会对性能造成内在影响。至少在理论层面上没有


我看到的唯一问题是,由于线程正在做不同的事情,它们的完成时间可能不同,因此一些线程在完成其工作后可能会处于空闲状态,等待其他线程完成一个较长的任务。

CUDA中的线程分歧一词指的是并非所有bock线程都以相同的结果评估一个条件的情况。据说这样的线索是有分歧的。如果发散的线程在同一个扭曲中,那么这些线程可能会连续执行工作,从而导致性能损失


不过,我不确定OpenMP是否存在同样的问题。当不同的线程执行不同的工作时,运行时可能会使用负载平衡,但这并不一定会导致工作序列化。

openmp中没有这种问题,因为每个openmp线程都有自己的PC。

感谢您的响应!第一篇关于堆栈溢出的帖子,我在10分钟内得到了两个回复。非常棒。只是好奇,如何在OpenMP中实现这一点?我知道你的问题已经得到了回答,但如果能看到一段代码就好了。这是个离题,但在你把主机代码变得过于复杂之前,CUDA可能不需要多个CPU线程——使用CUDA 4.0和更高版本,多GPU编程可以从一个主机线程完成,因此,除非您在主机端有并行工作要做,否则多线程只会增加复杂性。如果您在CPU上有并行工作要做,那么您可以使用一个CPU线程用于CUDA,其余线程用于并行执行CPU工作。