PDA

Просмотр полной версии : Как в MinGW включить поддержку OpenMP? (gcc.exe 4.2.1 Technology Preview)



TestICQ
28.01.2008, 11:36
Ситуация такова:
Необходимо откомпилировать программу, использующую OpenMP. (вариант игнорирования прагм и компиляции сериального кода неприемлим, нужно получить именно параллельную реализацию)
Компилировать нужно MinGW, а точнее портом gcc или g++ под Windows.

Для чего был скачан gcc версии 4.2.1, т.к. только с версии 4.0.0 он поддерживает OpenMP. Версия не финальная, а Technology Preview - другой небыло. Собсвенно вот, что было скачано и распаковано в C:\MinGW :
binutils-2.18.50-20080109.tar.gz.gz
gcc-core-4.2.1-sjlj-2.tar.gz
gcc-g++-4.2.1-sjlj-2.tar.gz
libgcc_sjlj_1.dll.gz
mingw-runtime-3.14.tar.gz
mingw-utils-0.3.tar.gz
mingw32-make-3.81-2.tar.gz
w32api-3.11.tar.gz
В описании указано, что необходим пакет win32-pthreads :
* OpenMP is enabled. To use it you will need to have win32-pthreads package installed. More details later.
Собственно - не вопрос, качаем :
pthreads-w32-2-8-0-release.exe
копируем pthread.h, sched.h, semaphore.h в C:MinGW\include\
libpthreadGC2.a, libpthreadGCE2.a в C:MinGW\lib\
libpthreadGCE2.a в libpthread.a (иногда советуют сделать копию с именем libpthread.a)
pthreadGC2.dll, pthreadGCE2.dll в C:MinGW\bin\

пробуем скомпилить pthread примерчики ( например barrier1.c )
gcc-sjlj -o1.exe barrier1.c -lpthread
Все ОК, только требует pthreadGCE2.dll (кто знает как включить библиотеку в тело бинарника - велкам!)

Но основной вопрос вот в чем:
пробуем компилить следующий простейший код "1.c", командой
gcc-sjlj -o1.exe -fopenmp 1.c

#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_dynamic(1);
omp_set_num_threads(10);
#pragma omp parallel // параллельный регион 1
{
#pragma omp single
printf("Num threads in dynamic region is = %d\n", omp_get_num_threads());
}
}

получаем кучу строк, типа:
libgomp.a(bar.o):bar.c: (.text+0x105): undefined reference to `__imp__sem_init'
libgomp.a(bar.o):bar.c: (.text+0x164): undefined reference to `__imp__pthread_mutex_lock'
libgomp.a(bar.o):bar.c: (.text+0x16d): undefined reference to `__imp__pthread_mutex_unlock'
libgomp.a(bar.o):bar.c: (.text+0x176): undefined reference to `__imp__pthread_mutex_destroy'
libgomp.a(bar.o):bar.c: (.text+0x17c): undefined reference to `__imp__sem_destroy'

что очень похоже на ситуацию, когда компилятор не находит библиотеку pthread
(Вернее даже не компилятор, а линкер, т.к. gcc с ключем -c создает объектный файл 1.o, а вот уже линкер, похоже, не находит самих функций при линковке)
пробуем компилить так:
gcc-sjlj -o1.exe -fopenmp -lpthread 1.c

результат аналогичный!!!!!

Комрады, кто знает где собака порылась?
Как правильно компилировать?

P.S. Вообще планируется потом нужные ключи прописать в Eclipse 3.3.1.1 Europe, для дальнейшей работы с кодом.

TestICQ
28.01.2008, 16:44
Все! Решение найдено по адресу
http://article.gmane.org/gmane.comp.gnu.mingw.user/23409

Вкратце делаем так:

g++-sjlj -mthreads -o 1.exe 1.o -lgomp -lpthreadGC2

Но лучше всего отредактировать libgomp.spec в каталоге lib/gcc/mingw32/4.2.1-sjlj
внеся в него следующую строчку

*link_gomp: -lgomp -lpthreadGC2
ну или
*link_gomp: -lgomp -lpthreadGCE2
кому какая библиотечка больше нравится

после чего компилируем так:
g++-sjlj -fopenmp -o 1.exe 1.o

Всем спасибо!

P.S.
Видимо вопрос про то как включить в бинарник pthreadGC2.dll (pthreadGCE2.dll), а не таскать с собой, придется в другую тему постить...