0

そのメンバーが配列であるデバイスで構造体を宣言し、これに動的にメモリを割り当てる方法。たとえば、以下のコードでは、コンパイラは次のように述べていますerror : calling a __host__ function("malloc") from a __global__ function("kernel_ScoreMatrix") is not allowed。このアクションを実行する別の方法はありますか?

dev_size_idx_threadsisのタイプint*と値。カーネルに送信され、メモリの割り当てに使用されます。

struct struct_matrix
{
    int *idx_threads_x;
    int *idx_threads_y;
    int thread_diag_length;
    int idx_length;
};

struct  struct_matrix matrix[BLOCK_SIZE_Y];

matrix->idx_threads_x= (int *) malloc ((*(dev_size_idx_threads) * sizeof(int) ));
4

1 に答える 1

4

デバイス コードから、動的メモリ割り当て (mallocおよびnew) は、cc2.0 以降のデバイスでのみサポートされます。cc2.0 以上のデバイスを使用していて、適切なフラグ ( など-arch=sm_20) を nvcc に渡す場合、このエラーは表示されません。複数のコンパイル ターゲット (sm_10、sm_20 など) を渡す場合、ターゲットの 1 つでも cc2.0+ の要件を満たしていないと、このエラーが表示されることに注意してください。

cc1.x デバイスを使用している場合は、これらのタイプの割り当てをホストから (たとえば を使用してcudaMalloc) 実行し、適切なポインターをカーネルに渡す必要があります。

そのルート (ホストからの割り当て) を選択した場合は、このような質問に対する私の回答にも興味があるかもしれませ

編集:以下の質問への回答:

  1. Visual Studio (2008 Express、他のバージョンでも同様である必要があります) では、次のようにコンパイル ターゲットを設定できます。右側のペインにGPU Architecture (1)((2)など) のようなエントリが表示されます。これらはドロップダウンであり、クリックしてコンパイルするターゲットを選択できます。GPU が sm_21 の場合、それを選択し(1)て他を空白のままにするか、sm_20 などの互換性のあるバージョンを選択します。
  2. 実際の例を見るには、上記のリンクをたどってください。ここでの私の回答と、それがどのように行われるかの説明から、いくつかの実例がリンクされています。
于 2013-05-29T16:11:07.293 に答える