libraberto.so
でコンパイルされた共有ライブラリがありPGCC
ます。これには OpenACC プラグマ ディレクティブが含まれており、-acc
これらのディレクティブが有効になるようにフラグを指定してコンパイルされます。対応するメイクファイルの規則は次のとおりです。
libraberto.so: file1.o file2.o ...
pgcc -shared -o./libraberto.so file1.o file2.o ...
%.o: %.c
pgcc -acc -Minfo=accel -c -fpic -I./inc/ -o./$@ $<
file1.c
、などは、ライブラリfile2.c
を構成するソース ファイルです。
次に、mex_gateway.c
単純に MATLAB から共有ライブラリ内のルーチンを呼び出し、変数 (配列とスカラー) を渡し、出力配列を受け取るファイルがあります。次のようにコンパイルされます。
mex -lraberto mex_gateway.c
コンパイルは正常に機能しますが、MATLAB でゲートウェイを実行しようとすると、次のエラーが発生します。
Invalid MEX-file '[...]/mex_gateway.mexa64':
[...]/libraberto.so: undefined symbol: __pgi_uacc_dataenterstart
Google でこの特定のエラー (シンボル) に関する情報を見つけることができず、コードのどこを見ればよいかわかりません。プログラムは、OpenACC ディレクティブなしで (つまり、なしで-acc
) 共有ライブラリをコンパイルすると正常に動作します。このエラーは、MEX ( ) で使用される配列の特定の性質が原因である可能性があると考えましたmxArray
。これは、データをアクセラレータに転送するときに OpenACC で適切に動作しない可能性がありますがmemcpy
、入力を真malloc
の C 配列に渡してから、共有ライブラリ ルーチンに違いはありません。