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デバイスカーネルを使用する正しい方法を教えていただけますか?