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

Привет дорогой друг

Наш сайт существует и развиваетется за счет рекламы. Пожалуйста, отключите блокировку рекламы AdBlock или подобное, для нашего сайта. Спасибо!
Показано с 1 по 2 из 2

Комбинированный просмотр

  1. #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.

  2. #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), а не таскать с собой, придется в другую тему постить...

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •