用来得到GPU信息:
nvaccelinfo
用于统计花费时间
nvprof ./test
最终QT编译添加:
QMAKE_CXXFLAGS += -fopenacc -fcf-protection=none -fopt-info-optimized-omp -fno-stack-protector -foffload=-lm -lm -fno-fast-math -fno-associative-math
QMAKE_LFLAGS += -fopenacc -fcf-protection=none -fopt-info-optimized-omp -fno-stack-protector -foffload=-lm -lm -fno-fast-math -fno-associative-math
如果openacc 编译报错如下:
:-1: error: /tmp/ccg3hMuj.crtoffloadtable.o: warning: relocation against `__offload_func_table' in read-only section `.rodata'
不用理会
另外编译完成后 makefile里要去了O2、O3后, 随便修改openacccore部分的代码再编译,因为O2、O3会修改代码结构。
配环境可能用到的:
apt install nvptx-tools gcc-11-offload-nvptx
之前用到的一些编译指令:
nvc++ -acc other.cpp -o other -lpgmath -lgomp -lblas -lacchost -lpgm -lomp -lnvomp -lnvf -lnvhpcatm -laccdevice -lpgc -lnvc -lcudart
g++-11 testACC.cpp -fopenacc -fcf-protection=none -fopt-info-optimized-omp -o test -fno-stack-protector
g++-11 testACC.cpp -o test
可以输出汇编结果
export GOMP_DEBUG=1
openacc经验:
最内层循环保证顺序,循环外不保证执行顺序
类成员变量不可以使用(不能传到显存),其他都可以
代码中被调用的函数需要在该行代码前面出现,应该避免递归
结构一般如下:
void init(){
#pragma acc enter data create(...)
}
void update_device(){
#pragma acc update device(...)
}
void update_host(){
#pragma acc update self(...)
}
#pragma acc routine seq
void fun(){
}
#pragma acc routine seq
void fun1(){
fun();
}
void fun2(){
...
#pragma acc parallel num_gangs(256) num_workers (16) vector_length(32) present(...)
{
#pragma acc loop gang collapse(2)
for ...
for ...
#pragma acc loop worker
for ...
#pragma acc loop vector collapse(2)
for ...
for ...
{
...
}
}