2015-03-27 20 views
12

TL; DR - GCC (gövde) zaten OpenPO 4.0 boşaltma işlemini nVidia GPU'ya destekliyor mu?GCC'de OpenMP 4.0: nVidia GPU'ya aktarma

Eğer öyleyse, ne yapıyorum yanlış? (aşağıdaki açıklama).


Ben Ubuntu 14.04.2 LTS koşuyorum.

En son GCC trunk numaralı telefonu (25 Mart 2015 tarihli) kontrol ettim.

Getting Started on Ubuntu kılavuzuna göre CUDA 7.0 araç setini yükledim. CUDA numuneleri başarıyla çalıştırmak, yani deviceQuery ben https://gcc.gnu.org/wiki/Offloading talimat yanı https://gcc.gnu.org/install/specific.html#nvptx-x-none

gibi nvptx-araçları ve nvptx-newlib (configure, make yüklemiş izlemiş 730.

benim GeForce GT algılar , sudo make install), newlib ayrıca GCC'nin gövde dizinine ln -s ile bağlanmıştır.

../../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 

... ve konak GCC derleyici kendisi: Ben LD_LIBRARY_PATH belirledik

../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 

Sonra hedef hızlandırıcı nvptx-hiçbiri derleyici inşa buna göre:

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 
Elbette

, mkoffload aracı oluşturulmuştur:

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

yanı hedef ve ana derleyiciler orada:

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

Ama sayısını sorgulayan bir örnek kod derleme yaparken omp_get_num_devices() numaralı aygıtlara yanıt veririm, yanıt 0:

$ /install/usr/local/bin/x86_64-pc-linux-gnu-gcc -fopenmp -foffload=nvptx-none main.c 
$ ./a.out 
0 
Ben hedef derleyici'nın seçeneklerine -v (ayrıntılı) seçeneği eklediğinizde

, aşağıdaki çıktıyı almak:

$ /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' 

yüzden araç zinciri çağrılan ve .mkoffload dosyaları oluşturulur olduğunu görünüyor.

Lütfen

Yardım edin. Eğer işe yarayacaksa, neyin yanlış olduğunu nasıl teşhis edebilirim?

+0

Tamamen işlevsel bir CUDA yüklemeniz var mı? – talonmies

+0

@talonmies CUDA örnekleri nvidia GPU –

+0

'umu başarıyla algılamaya çalıştı. Üzgünüm, ama sormam gerekiyordu. İnsanların buraya kodlarının neden işe yaramadığını ve kök nedeninin işlevsel bir CUDA kurulumuna sahip olmadıklarını sormak için buraya kaç kez geldiğine inanmazsınız. – talonmies

cevap

13

TL; DR - GCC (gövde) zaten OpenPO 4.0 boşaltma işlemini nVidia GPU'ya destekliyor mu?

sayılı

Şu GCC sadece OpenMP Intel Xeon Phi (KNL) için 4,0 boşaltma ve nVidia GPU'ya OpenACC 2.0 boşaltma destekler.

nVidia GPU: [1], [2]'a OpenMP 4.0 yüklemesini destekleme hakkında fikirler vardır, ancak uygulama henüz başlamamıştır.

UPD 2017: GCC 7.1 artık NVIDIA GPU'larına [3] OpenMP 4.5 yüklemesini desteklemektedir.

+0

Oh, peki bu [manual] (https://gcc.gnu.org/wiki/Offloading) ne anlama geliyor? OpenMPC'nin çalışması için nvptx-none hedef derleyicisinin yapılandırılması gerektiği anlamına mı geliyor, düşündüğüm gibi OpenMP4 için değil mi? Ya da OpenACC üzerinden GPU'ya iş yükünü boşaltmak için başka ön şartlar var mı? –

+2

Evet, OpenACC-> PTX için (ayrıca destekleneceği zaman OpenMP -> PTX için) nvptx-none hedef derleyici gereklidir. Karışıklığı önlemek için OpenMP-> PTX'in henüz desteklenmediği wiki sayfasına ekleyeceğim. AFAIK bu kılavuz, OpenACC-> PTX ile ilgili olarak tamamlanmıştır, ancak kendim denemedim. –

+0

Oh, bu benim için üzücü bir haber. GCC ile nvidia boşaltmanın ne zaman mümkün olacağını biliyor musunuz? (ya da clang gibi başka bir derleyici ile?) –