Показано с 1 по 2 из 2
-
28.01.2008, 12:36 #1
- Регистрация
- 28.01.2008
- Сообщений
- 2
- Сказал(а) спасибо
- 0
- Поблагодарили 0 раз(а) в 0 сообщениях
Как в MinGW включить поддержку OpenMP? (gcc.exe 4.2.1 Technology Preview)
Ситуация такова:
Необходимо откомпилировать программу, использующую 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 в 12:48.
-
28.01.2008, 17:44 #2
- Регистрация
- 28.01.2008
- Сообщений
- 2
- Сказал(а) спасибо
- 0
- Поблагодарили 0 раз(а) в 0 сообщениях
Все! Решение найдено по адресу
http://article.gmane.org/gmane.comp....ngw.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), а не таскать с собой, придется в другую тему постить...
Социальные закладки