1

CentOS リリース 5.9 (Final) を CUDA で実行しており、メジャー バージョン 1 とマイナー バージョン 3 の Tesla カードを使用しています。以下は私のカーネル コードです。

__global__ void foo(int* pos, int t)
{
    int index = blockDim.x * blockIdx.x + threadIdx.x; 
    t = pos [index + 1] - pos [index];  
    char* temp = (char*)malloc(t);
}

tバイトを動的 に割り当てたい。

これは私にエラーを与えます:

__device__/__global__ 関数 ("foo") からホスト関数 ("malloc") を呼び出すことは許可されていません。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

コンピューティング 1.3 デバイスを使用しているため、カーネルmallocと C++new演算子はサポートされていません (これは CUDA C プログラミング ガイドで明確に説明されています)。

唯一の代替手段は、ホスト側のメモリ割り当てを使用してスクラッチ グローバル メモリ領域を事前に割り当てることです (これは少なくとも t の最大値 * GPU で起動されたスレッドの数である必要があります)。このメモリは、コマンド引数として渡すか、カーネルが読み取ることができる定数メモリ ポインターに書き込むことができます。tempカーネルで静的サイズのローカル メモリ配列として宣言することもできます。の相対的に小さくアプリオリに既知の値が必要であることが判明した場合はmax(t)、カーネル パスmax(t)をテンプレート パラメーターとしてテンプレート化すると、パフォーマンスが向上する可能性があります。

于 2013-05-31T10:06:58.023 に答える