小编mas*_*sab的帖子

具有多个Pthread的MPI

我正在使用以下代码段来初始化多个线程的mpi库.但是我总是得到以下输出,说明此MPI实现不支持MPI_THREAD_MULTIPLE.

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided); 
if(provided != MPI_THREAD_MULTIPLE) 
{
   fprintf(stderr, "This MPI implementation does not support MPI_THREAD_MULTIPLE.\n"
}
Run Code Online (Sandbox Code Playgroud)

在做

mpiexec --version and ompi_info
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:mpiexec(OpenRTE)1.4.3和Open MPI:1.4.3

我使用mpicc mpi_hello.c编译,其中c文件包含上面的代码部分.我的mpi库不支持多线程的任何想法?我想从不同的线程发送和接收mpi消息,而不是进程.

谢谢

c multithreading mpi openmpi

3
推荐指数
1
解决办法
2375
查看次数

使用原子内置的旋转线程屏障

我正在尝试使用原子,特别是 __sync_fetch_and_add 来实现旋转线程屏障。https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Atomic-Builtins.html

我基本上想要一个 pthread 屏障的替代方案。我在一个可以并行运行大约一百个线程的系统上使用 Ubuntu。

int bar = 0;                      //global variable
 int P = MAX_THREADS;              //number of threads

 __sync_fetch_and_add(&bar,1);     //each thread comes and adds atomically
 while(bar<P){}                    //threads spin until bar increments to P
 bar=0;                            //a thread sets bar=0 to be used in the next spinning barrier
Run Code Online (Sandbox Code Playgroud)

由于明显的原因,这不起作用(一个线程可能设置 bar=0,而另一个线程陷入无限 while 循环等)。我在这里看到了一个实现:使用 c++11 原子编写(旋转)线程屏障,但它似乎太复杂了,我认为它的性能可能比 pthread 屏障更差。

由于 bar 的缓存线在线程之间进行乒乓球交换,因此该实现预计还会在内存层次结构中产生更多流量。

关于如何使用这些原子指令来制作简单的屏障有什么想法吗?另外,通信优化方案也会有所帮助。

c++ multithreading atomic barrier compare-and-swap

1
推荐指数
1
解决办法
1758
查看次数

标签 统计

multithreading ×2

atomic ×1

barrier ×1

c ×1

c++ ×1

compare-and-swap ×1

mpi ×1

openmpi ×1