Я думаю, что то, что вы ищете, может быть решено с помощью техники диспетчера ЦП .
Для сравнения кода OpenMP с не-OpenMP кодом вы можете создавать разные объектные файлы из одного и того жевот такой исходный код
//foo.c
#ifdef _OPENMP
double foo_omp() {
#else
double foo() {
#endif
double sum = 0;
#pragma omp parallel for reduction(+:sum)
for(int i=0; i<1000000000; i++) sum += i%10;
return sum;
}
Скомпилируйте вот так
gcc -O3 -c foo.c
gcc -O3 -fopenmp -c foo.c -o foo_omp.o
Это создаст два объектных файла foo.o
и foo_omp.o
.Затем вы можете вызвать одну из этих функций, например:
//bar.c
#include <stdio.h>
double foo();
double foo_omp();
double (*fp)();
int main(int argc, char *argv[]) {
if(argc>1) {
fp = foo_omp;
}
else {
fp = foo;
}
double sum = fp();
printf("sum %e\n", sum);
}
Компилировать и ссылаться следующим образом
gcc -O3 -fopenmp bar.c foo.o foo_omp.o
Затем я проверяю время следующим кодом
time ./a.out -omp
time ./a.out
ипервый случай занимает около 0,4 с, а второй - около 1,2 с в моей системе с 4 ядрами / 8 аппаратными потоками.
Вот решение, для которого нужен только один исходный файл
#include <stdio.h>
typedef double foo_type();
foo_type foo, foo_omp, *fp;
#ifdef _OPENMP
#define FUNCNAME foo_omp
#else
#define FUNCNAME foo
#endif
double FUNCNAME () {
double sum = 0;
#pragma omp parallel for reduction(+:sum)
for(int i=0; i<1000000000; i++) sum += i%10;
return sum;
}
#ifdef _OPENMP
int main(int argc, char *argv[]) {
if(argc>1) {
fp = foo_omp;
}
else {
fp = foo;
}
double sum = fp();
printf("sum %e\n", sum);
}
#endif
Скомпилируйте вот так
gcc -O3 -c foo.c
gcc -O3 -fopenmp foo.c foo.o