OpenMP 4.0 в GCC: разгрузка на nVidia GPU

TL; DR - поддерживает ли GCC (соединительная линия) поддержку OpenMP 4.0 для nVidia GPU?

Если да, то что я делаю неправильно? (описание ниже).


Я запускаю Ubuntu 14.04.2 LTS.

Я проверил самый последний соединительный кабель GCC (от 25 марта 2015 г.).

Я установил инструментарий CUDA 7.0 в соответствии с Руководство по началу работы с Ubuntu. Образцы CUDA успешно выполняются, т.е. deviceQuery обнаруживает мою GeForce GT 730.

Я выполнил инструкции https://gcc.gnu.org/wiki/Offloading, а также < а2 >

Я установил nvptx-tools и nvptx-newlib (configure, make, sudo make install), newlib также связан внутри каталога соединительной линии GCC с ln -s.

Затем я построил компилятор целевой ускоритель nvptx-none:

../../trunk/configure --target=nvptx-none --enable-as-accelerator-for=x86_64-pc-linux-gnu --with-build-time-tools=/usr/local/nvptx-none/bin --disable-sjlj-exceptions --enable-newlib-io-long-long
make -j 9
sudo make install DESTDIR=/install

... и компилятор хоста GCC:

../trunk/configure --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu --enable-offload-targets=nvptx-none=/install/prefix --with-cuda-driver=/usr/local/cuda --enable-languages=c,c++
make -j 9
sudo make install DESTDIR=/install

Я установил LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=/install/usr/local/lib64:/install/usr/local/lib/gcc/nvptx-none/5.0.0/:/usr/local/cuda/lib64:$LD_LIBRARY_PATH

Конечно, инструмент mkoffload построен:

/install/usr/local/libexec/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/mkoffload

а также компиляторы цели и хоста:

/install/usr/local/bin/x86_64-pc-linux-gnu-gcc
/install/usr/local/bin/x86_64-pc-linux-gnu-accel-nvptx-none-gcc

Но когда я компилирую пример кода, который запрашивает количество устройств с omp_get_num_devices(), я получаю ответ 0:

$ /install/usr/local/bin/x86_64-pc-linux-gnu-gcc -fopenmp -foffload=nvptx-none main.c
$ ./a.out
0

Когда я добавляю опцию -v (verbose) к параметрам целевого компилятора, я получаю следующий вывод:

$ /install/usr/local/bin/x86_64-pc-linux-gnu-gcc -fopenmp -foffload=nvptx-none="-v" main.c

Using built-in specs.
COLLECT_GCC=/install/usr/local/bin/x86_64-pc-linux-gnu-accel-nvptx-none-gcc
Target: nvptx-none
Configured with: ../../trunk/configure --target=nvptx-none --enable-as-accelerator-for=x86_64-pc-linux-gnu --with-build-time-tools=/usr/local/nvptx-none/bin --disable-sjlj-exceptions --enable-newlib-io-long-long
Thread model: single
gcc version 5.0.0 20150325 (experimental) (GCC) 
COLLECT_GCC_OPTIONS='-m64' '-S' '-fmath-errno' '-fsigned-zeros' '-ftrapping-math' '-fno-trapv' '-fno-strict-overflow' '-fno-openacc' '-foffload-abi=lp64' '-fopenmp' '-v' '-v' '-o' '/tmp/cccxIggp.mkoffload'
 /install/usr/local/bin/../libexec/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/lto1 -quiet -dumpbase ccKOW9hi.o -m64 -auxbase-strip /tmp/cccxIggp.mkoffload -version -fmath-errno -fsigned-zeros -ftrapping-math -fno-trapv -fno-strict-overflow -fno-openacc -foffload-abi=lp64 -fopenmp -o /tmp/cccxIggp.mkoffload @/tmp/ccjRDWhp
GNU GIMPLE (GCC) version 5.0.0 20150325 (experimental) (nvptx-none)
    compiled by GNU C version 5.0.0 20150325 (experimental), GMP version 5.1.3, MPFR version 3.1.2-p3, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
GNU GIMPLE (GCC) version 5.0.0 20150325 (experimental) (nvptx-none)
    compiled by GNU C version 5.0.0 20150325 (experimental), GMP version 5.1.3, MPFR version 3.1.2-p3, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
COMPILER_PATH=/install/usr/local/bin/../libexec/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/:/install/usr/local/bin/../libexec/gcc/
LIBRARY_PATH=/install/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/:/install/usr/local/bin/../lib/gcc/
COLLECT_GCC_OPTIONS='-m64' '-S' '-fmath-errno' '-fsigned-zeros' '-ftrapping-math' '-fno-trapv' '-fno-strict-overflow' '-fno-openacc' '-foffload-abi=lp64' '-fopenmp' '-v' '-v' '-o' '/tmp/cccxIggp.mkoffload'

Итак, похоже, что вызвана инструментальная цепочка и создаются файлы .mkoffload.

Пожалуйста, помогите. Если это сработает, как я могу диагностировать, что неправильно?

Ответ 1

TL; DR - поддерживает ли GCC (соединительная линия) поддержку OpenMP 4.0 для nVidia GPU?

Нет.

В настоящее время GCC поддерживает только разгрузку OpenMP 4.0 для разгрузки Intel Xeon Phi (KNL) и OpenACC 2.0 на графический процессор nVidia.

Есть идеи по поддержке разгрузки OpenMP 4.0 на GPU nVidia: [1], [2], но реализация еще не началась.

UPD 2017: GCC 7.1 теперь поддерживает разгрузку OpenMP 4.5 на графические процессоры NVidia [3].