我正在使用以下代码段来初始化多个线程的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消息,而不是进程.
谢谢
我正在尝试使用原子,特别是 __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 的缓存线在线程之间进行乒乓球交换,因此该实现预计还会在内存层次结构中产生更多流量。
关于如何使用这些原子指令来制作简单的屏障有什么想法吗?另外,通信优化方案也会有所帮助。