2012-03-28 8 views
1

私はC++でstringデータ型を使用しているCUDAカーネルを作成しています。ただし、コンパイラは次のエラーをスローしています。文字列データ型をC++ CUDAカーネルで使用できますか?

error: calling a host function("std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator =") from a __device__/__global__ function("doDecompression") is not allowed 

カーネル内では文字列は使用できませんか?そうでない場合は、カーネル内のchar配列にスペースを割り当てる回避策は何ですか?

+0

カーネル関数でC文字列を使用する –

+0

@PaulR:C++文字列をカーネルに渡しているとします。 CUDAはこれについて不平を言っていません。これをカーネル内のC文字列にキャストするにはどうすればよいですか?例 – Programmer

+0

根底にあるデータをカーネルに渡すだけです。 'string :: c_str()'メソッドを使用して、ホストコード内のCデータへのポインタを抽出し、カーネル関数に渡します。 –

答えて

4

CUDAには、GPU上で実行可能なC++ Stringライブラリのデバイスバージョンが含まれていないため、C++ stringタイプをカーネルに使用することはできません。カーネルでstringを使用することは可能であったとしても、stringはメモリを動的に処理するため、実行したくないものです。これは遅くなる可能性があります。

代わりに、固定長の文字列の配列を作成し、それに文字列をコピーします。次に、配列をGPUにコピーします。文字列配列のベースアドレスをカーネルに渡し、インデックスに基づいたオフセットをベースアドレスに追加して、各スレッドが指定された文字列へのアドレスを計算させるようにします。

関連する問題