▶ 在 windows 10 上搭建 OpenACC 环境
● 安装顺序:Visual Studio(PGI 18.04 不支持 VS 2017,PGI 19.04 已经支持到 VS 2019 啦!);CUDA Toolkite(https://developer.nvidia.com/cuda-downloads);PGI 编译器(https://www.pgroup.com/products/community.htm?*utm*_campaign=CE&utm_source=dev_nvidia_oacc&utm_medium=web_link&utm_term=*get_ce_text*)
● PGI 自带的 pgaccinfo.exe 抓取设备信息:
CUDA Driver Version: 10010 Device Number: 0 Device Name: GeForce GTX 1070 Device Revision Number: 6.1 Global Memory Size: 8589934592 Number of Multiprocessors: 16 Concurrent Copy and Execution: Yes Total Constant Memory: 65536 Total Shared Memory per Block: 49152 Registers per Block: 65536 Warp Size: 32 Maximum Threads per Block: 1024 Maximum Block Dimensions: 1024, 1024, 64 Maximum Grid Dimensions: 2147483647 x 65535 x 65535 Maximum Memory Pitch: 2147483647B Texture Alignment: 512B Clock Rate: 1645 MHz Execution Timeout: Yes Integrated Device: No Can Map Host Memory: Yes Compute Mode: default Concurrent Kernels: Yes ECC Enabled: No Memory Clock Rate: 4004 MHz Memory Bus Width: 256 bits L2 Cache Size: 2097152 bytes Max Threads Per SMP: 2048 Async Engines: 2 Unified Addressing: Yes Managed Memory: Yes Concurrent Managed Memory: No Preemption Supported: Yes PGI Default Target: -ta=tesla:cc60
● 编写代码
1 #include <stdio.h> 2 #include <openacc.h> 3 4 int main() 5 { 6 #ifdef _OPENACC 7 printf("%d device found! ", acc_get_num_devices(acc_device_not_host)); 8 #else 9 printf("OpenACC not support. "); 10 #endif 11 getchar(); 12 return 0; 13 }
● 直接在 Visual Studio 2015 编译遇到了一些问题,最后是用 PGI 的命令行来进行编译的。添加 openacc.h 的路径(C:Program FilesPGICEwin6418.4include)报错:
严重性 代码 说明 项目 文件 行 错误 C1021 无效的预处理器命令“include_next” OpenACCProject c:program filespgicewin6418.4includesal.h 28
<sal.h> 第 28 行 #include_next <sal.h> ,意思是该 <sal.h> 中没有找到对应的头文件,要求预处理器去包含搜索路径的下一个 <sal.h>。但是 include_next 不是标准 C 的预处理器语句,在 Visual Studio 中无法执行(据说有办法解决,看起来有点麻烦,https://stackoverflow.com/questions/24638855/how-to-use-arduino-with-microsoft-visual-studio-due-to-include-next-precompil)。如果将该头文件中
1 ... 2 #if defined __PGI_TOOLS14 3 #include <sal14.h> 4 ...
前面强行添上 #include <sal4.h> (该目录下确实有 <sal14.h> 这个头文件)并删除 #include_next 行,则会引起 vadefs.h 中的相同类型的错误,再把 vadefs.h 中
1 ... 2 #if defined __PGI_TOOLS12 3 #include <vadefs12.h> 4 ...
前面强行添上 #include <C:/Program Files/PGICE/win64/18.4/include_acc/OT_14/vadefs.h> ,则没有了 #include_next 错误,但会有链接阶段报错:
严重性 代码 说明 项目 文件 行 错误 LNK1158 无法运行“rc.exe” OpenACCProject D:CodeOpenACCOpenACCProjectOpenACCProjectLINK 1
说到底这是 MS 编译器不支持 OpenACC 的原因,缺少宏 _OPENACC 的定义
● 代码在 PGI 的命令行中正确的编译和执行
1 PGI Community Edition 18.4 2 Microsoft Windows [版本 10.0.17134.1] 3 (c) 2018 Microsoft Corporation。保留所有权利。 4 5 C:Userscuan>D: 6 7 D:>cd D:CodeOpenACCOpenACCProjectOpenACCProject 8 9 D:CodeOpenACCOpenACCProjectOpenACCProject>pgcc -o main-no-acc.exe main.c 10 11 D:CodeOpenACCOpenACCProjectOpenACCProject>main-no-acc.exe 12 OpenACC not support. 13 14 15 D:CodeOpenACCOpenACCProjectOpenACCProject>pgcc -acc -o main.exe main.c 16 17 D:CodeOpenACCOpenACCProjectOpenACCProject>main.exe 18 1 device found! 19 20 21 D:CodeOpenACCOpenACCProjectOpenACCProject>
▶ 在 Ubuntu16.04LTS 上搭建 OpenACC 环境
● 安装顺序:CUDA Toolkite(https://developer.nvidia.com/cuda-downloads);PGI 编译器(https://www.pgroup.com/products/community.htm?*utm*_campaign=CE&utm_source=dev_nvidia_oacc&utm_medium=web_link&utm_term=*get_ce_text*)
cuan@CUAN:~/pgilinux-2019-194-x86-64$ sudo su root@CUAN:/home/cuan/pgilinux-2019-194-x86-64# ./install Welcome to the PGI Linux installer! You are installing PGI 2019 version 19.4 for Linux. Please note that all Trademarks and Marks are the properties of their respective owners. Press enter to continue... # 回车 NVIDIA ... Do you accept these terms? (accept,decline) # accept ... 1 Single system install 2 Network install Please choose install option: # 1 ... Installation directory? [/opt/pgi] # /usr/local/pgi ... JRE Press enter to continue... # 回车 ... Do you accept these terms? (accept,decline) # accept ... Do you wish to update/create links in the 2019 directory? (y/n) # y ... MPI ... Do you want to install Open MPI onto your system? (y/n) # y Do you want to enable NVIDIA GPU support in Open MPI? (y/n) # y ... License Key Management ... Do you wish to obtain permanent license key or configure license service? (y/n) # y ... Press enter to continue... # 回车 ... 1 Generate or update a license key for this computer ** Option 1 IS NOT AVAILABLE. Requires properly configurd curl and internet access. 2 Configure and start a license service on this computer 4 I have a functioning license key - what type is it? (beta) 5 Quit What do you want to do? # 2 Please enter the location of the license key file. For example: /usr/local/pgi/license.dat Answer? # /usr/local/pgi/license.dat Should license services start when the system boots? (y/n) # y Master daemon (lmgrd) is not running Vendor daemon (pgroud) is not running The PGI license tool can be re-started by running the script located at: /usr/local/pgi/linux86-64-llvm/19.4/bin/pgi_license_tool The license key file is located at /usr/local/pgi/license.dat. ...
● 添加路径到 .bashrc,并执行 source .bashrc
#for pgi export PATH=$PATH:/usr/local/pgi/linux86-64/18.4/bin export MANPATH=$MANPATH:/usr/local/pgi/linux86-64/18.4/man export LM_LICENSE_FILE=/usr/local/pgi/license.dat
● 编写代码同上,编译执行:
cuan@CUAN:~$ pgcc --version pgcc 18.4-0 64-bit target on x86-64 Linux -tp haswell PGI Compilers and Tools Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. cuan@CUAN:~$ cd Temp/ cuan@CUAN:~/Temp$ pgcc -o main-no-acc.exe main.c cuan@CUAN:~/Temp$ pgcc -acc -o main.exe main.c cuan@CUAN:~/Temp$ ./main-no-acc.exe OpenACC not support. cuan@CUAN:~/Temp$ ./main.exe 1 device found! cuan@CUAN:~/Temp$
● 几个坑:
■ linux 上要先装了 gcc/g++ 才能安装 pgi, apt-get install build-essential
■ .bashrc 中加入 export 时,等号两边不能有空格
■ 误删了 .bashrc,从备份中去找, cp /etc/skel/.bashrc ~/
■ 在 Win10 WSL 上安装有点问题,核心问题是 Nvidia 的驱动安装不了,而 CUDA SDK 对其有依赖,强行安装 pgi 以后可以正常用 pgcc 编译,但是运行如上的代码时总是显示 0 device found! 它到底有没有调用 CUDA 核进行计算有待进一步探究,暂时折腾不动了
■ 删除 cygwin 用的 .bat,就是获得其文件的所有权。参考【https://www.cnblogs.com/litifeng/p/9996909.html】
1 SET DIRECTORY_NAME="D:cygwin64" 2 C:windowssystem32TAKEOWN /f %DIRECTORY_NAME% /r /d y 3 C:windowssystem32ICACLS %DIRECTORY_NAME% /grant administrators:F /t 4 PAUSE