我正在使用Mac OSX 10.8.4并在C中编程。我尝试使用openmp并且我正在使用gcc-mp-4.7进行编译。我在bash工作。目前我有一个可执行文件(我将在程序中调用executable1),我试图通过在openmp并行for循环中使用系统调用来并行运行。示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
void main() {
int n = 100;
double var1 = 65.4;
char place[100] = "/under/a/rock";
double var2 = 4.5e4;
double var3;
char program[200];
int i;
#pragma omp parallel for private(program,var3)
for (i=0; i<=n; i++) {
var3 = var1*pow(var2,i);
sprintf(program,"./executable1 %.15e %s %.15e %d", var1, place, var2, var3, i);
printf("%s \n", program);
system(program);
}
}
我使用gcc-mp-4.7 -fopenmp my_omp.c
编译程序,然后运行新编译的可执行文件(与exectuable1命名不同)。
似乎发生的是8(我认为是“cpus”openmp认为我有的)打印语句的数量将出现在stdout(终端)中然后它将只运行一次可执行文件1 ,然后当它完成它打印出另一个printf程序行,然后运行另一个executable1直到它完成for循环(我知道这是因为executable1非常冗长,并且显然是两个运行作为数字打印到stdout将运行不同步并出现在倍数中。)
所以似乎printf并行运行,但由于某种原因,system()命令不是?有没有人有任何想法?
感谢您提供的任何帮助。
我已经得到了这个确切的代码,可以在使用不同编译器的lunix发行版上正常运行,我将研究如何在Mac OSX中使用更好的编译器,看看是否有效。
答案 0 :(得分:1)
OS X中的system(3)
库调用是使用全局互斥锁实现的 - 请参阅OS X C库源代码中的system.c文件:
#if __DARWIN_UNIX03
pthread_mutex_lock(&__systemfn_mutex);
#endif /* __DARWIN_UNIX03 */
...
#if __DARWIN_UNIX03
pthread_mutex_unlock(&__systemfn_mutex);
#endif /* __DARWIN_UNIX03 */
因此,当一个线程调用system(3)
时,所有其他线程必须等待第一次调用完成,从而导致序列化执行。