MATLAB MEXコードでCUDA Thrustライブラリを使用する際に問題があります。MATLAB MEXファイルの推力を使用したランタイムリンカエラー
私は外部でうまく動作する例がありますが、コンパイルしてMEXファイルとして実行すると、実行時に "missing symbol"エラーが発生します。
これはThrustライブラリに固有のようです。 thrust::device_vector
の代わりにcudaMemcpy
またはcublasSetVector
とcudaMalloc
を使用すると、すべて正常です。
最小例
thrustDemo.cu:
#ifdef MATLAB_MEX_FILE
#include "mex.h"
#include "gpu/mxGPUArray.h"
#endif
#include <thrust/device_vector.h>
#include <vector>
void thrustDemo() {
std::vector<double> foo(65536, 3.14);
thrust::device_vector<double> device_foo(foo);
}
#ifdef MATLAB_MEX_FILE
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray const *prhs[]) {
thrustDemo();
}
#else
int main(void) { thrustDemo(); }
#endif
問題
私は、コマンドライン(nvcc thrustDemo.cu
)からこれをコンパイルしてうまく結果の実行可能ファイルを実行することができます。
私はMATLAB MEXファイル(MATLAB R2017aの中からmexcuda thrustDemo.cu
)としてこれを構築しようとした際、それがうまくコンパイルとリンク:
>> mexcuda thrustDemo.cu
Building with 'nvcc'.
MEX completed successfully.
しかし、私はそれを実行しようとすると、私は次のエラーを取得します:
>> thrustDemo()
Invalid MEX-file '/home/kqs/thrustDemo.mexa64':
Missing symbol '_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5emptyEv' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt12length_errorC1EPKc' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt13runtime_errorC2EPKc' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEPKc' required by '/home/kqs/thrustDemo.mexa64'
Missing symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLERKS4_' required by '/home/kqs/thrustDemo.mexa64'.
これは私にとってはかなり外国語です。誰かがこれが何を意味するのか教えていただけますか?これらはリンカエラーのように見えますが、実行時に生成されています。また、推力はテンプレートライブラリであると思ったので、リンクするのは何ですか?
最後に、thrust::device_vector
をcudaMalloc
と置き換えて、cudaMemcpy
またはcublasSetVector
のいずれかが問題なく機能します。だから今は私のコードでcudaMalloc
の束で立ち往生しています。私は本当に推力を使うことができたいと思っています。
バージョン
MATLAB R2017a
nvcc
V8.0.61、gcc
5.4.0、Ubuntuの16.04.2
NVIDIAドライバ375.39、GTX 1060グラフィックスカード(6.1計算能力)
更新:ldd
出力
コメントごとに、私はtの依存関係を調べましたldd thrustDemo.mexa64
を使用して、彼MEXファイル:
linux-vdso.so.1 => (0x00007ffdd35ea000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f097eccf000)
libcudart.so.8.0 => /usr/local/cuda-8.0/targets/x86_64-linux/lib/libcudart.so.8.0 (0x00007f097ea69000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f097e852000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f097e489000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f097e180000)
/lib64/ld-linux-x86-64.so.2 (0x0000562df178c000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f097df7b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f097dd5e000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f097db56000)
は、私はこれらの不足しているシンボルの一つを探してみました、そして、それを見つけることができた:
$ nm -D /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep "_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv"
0000000000120be0 W _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv
だからそれはMATLABが間違った場所で探してしなければならないようです。
それは実行時エラーではありません。 mexファイルがロードされているときにエラーが発生しています。私はエラーの原因を知りません。しかしlinuxのlddのようなツールを使ってmexファイルを調べて、依存関係を調べることができるはずです。 – Navan
これはある種の壊れたC++/stdlibの問題またはホストコンパイラの不一致です。関連する機能は、私が見CUDA – talonmies
とは何の関係もない 'のstd :: __ cxx11 ::のbasic_string、STD ::アロケータ> :: c_str()const'です。エラー出力は今より多くの意味があります。私は、MATLABが根本的な原因であるかもしれない 'libstdC++'の独自のバージョンを使用することを好むと思います。皆さんのご意見ありがとうございます。 –
KQS