简要地说 ,我的问题依赖于在两个不同的编译器中编译/构建文件(使用库),同时在源文件中利用OpenACC构造。
我有一个具有OpenACC构造的C源文件。它只有一个简单的函数来计算数组的总和:
#include <stdio.h>
#include <stdlib.h>
#include <openacc.h>
double calculate_sum(int n, double *a) {
double sum = 0;
int i;
printf("Num devices: %d\n", acc_get_num_devices(acc_device_nvidia));
#pragma acc parallel copyin(a[0:n])
#pragma acc loop
for(i=0;i<n;i++) {
sum += a[i];
}
return sum;
}
我可以使用以下行轻松编译它:
pgcc -acc -ta=nvidia -c libmyacc.c
然后,按照以下行创建一个静态库:
ar -cvq libmyacc.a libmyacc.o
要使用我的库,我写了一段代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 1000
extern double calculate_sum(int n, double *a);
int main() {
printf("Hello --- Start of the main.\n");
double *a = (double*) malloc(sizeof(double) * N);
int i;
for(i=0;i<N;i++) {
a[i] = (i+1) * 1.0;
}
double sum = 0.0;
for(i=0;i<N;i++) {
sum += a[i];
}
printf("Sum: %.3f\n", sum);
double sum2 = -1;
sum2 = calculate_sum(N, a);
printf("Sum2: %.3f\n", sum2);
return 0;
}
现在,我可以使用这个静态库和PGI编译器本身来编译上面的源代码(f1.c
):
pgcc -acc -ta=nvidia f1.c libmyacc.a
它会完美无瑕地执行。但是,它与gcc不同。我的问题依赖于此。如何使用gcc正确构建它?
感谢Jeff对此问题的评论:
linking pgi compiled library with gcc linker,现在我可以无错误地构建我的源文件(f1.c
),但可执行文件会发出一些致命的错误。
这是我用gcc(f1.c
)编译我的源文件:
gcc f1.c -L/opt/pgi/linux86-64/16.5/lib -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L. -laccapi -laccg -laccn -laccg2 -ldl -lcudadevice -lpgmp -lnuma -lpthread -lnspgc -lpgc -lm -lgcc -lc -lgcc -lmyacc
这是错误:
Num devices: 2
Accelerator Fatal Error: No CUDA device code available
在使用PGI编译器编译-v
时感谢f1.c
选项,我看到编译器从PGI和NVidia调用了许多其他工具(如pgacclnk
和nvlink
) 。
我的问题:
pgacclnk
和nvlink
)的静态链接吗?答案 0 :(得分:1)
添加&#34; -ta = tesla:nordc&#34;你的pgcc编译。默认情况下,PGI对GPU代码使用运行时动态编译(RDC)。但是,RDC需要gcc不支持的额外链接步骤(使用nvlink)。 &#34; nordc&#34;子选项禁用RDC,因此您可以在库中使用OpenACC代码。但是,通过禁用RDC,您无法再从计算区域调用外部设备例程。
% pgcc -acc -ta=tesla:nordc -c libmyacc.c
% ar -cvq libmyacc.a libmyacc.o
a - libmyacc.o
% gcc f1.c -L/proj/pgi/linux86-64/16.5/lib -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L. -laccapi -laccg -laccn -laccg2 -ldl -lcudadevice -lpgmp -lnuma -lpthread -lnspgc -lpgc -lm -lgcc -lc -lgcc -lmyacc
% a.out
Hello --- Start of the main.
Sum: 500500.000
Num devices: 8
Sum2: 500500.000
希望这有帮助, 垫