如果我在 hello.cu 文件中有简单的测试 cuda 内核:
extern "C" __device__ float radians( float f ){
return f*3.14159265;
}
并在 mainacc.c 中测试 OpenACC 代码:
#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma acc routine seq
extern float radians( float );
int main() {
int i;
float *hptr, *dptr;
hptr = (float *) calloc(N, sizeof(float));
#pragma acc parallel loop copy(hptr[0:N])
for(i=0; i<N; i++) {
hptr[i] = radians(i*0.1f);
}
for( i=0; i< N; i++)
printf("\n %dth value : %f", i, hptr[i]);
return 0;
}
如果我尝试按如下方式编译此代码,则会出现链接时间错误:
nvcc hello.cu -c
cc -hacc -hlist=a mainacc.c hello.o
nvlink error : Undefined reference to 'radians' in '/tmp/pe_20271//app_cubin_20271.omainacc_1.o__sec.cubin'
cuda_link: nvlink fatal error
我用“--relocatable-device-code true”选项等尝试了nvcc,但没有成功。加载的模块是:
craype-accel-nvidia35
cudatoolkit/6.5
PrgEnv-cray/5.2.40
你能告诉我在 OpenACC中使用 cuda设备内核的正确方法吗?