1

私は、各カーネル関数からアクセスできる変数を割り当てようとしています。私の試みは以下に添付されたコードですが、カーネルがアクセスしてdArrayを表示できないため、コンパイルされません。C ++では、変数を一番上に配置するか、プログラム全体のすべてのスコープで静的にアクセスすることを宣言します。

__global__ void StoreThreadNumber()
{
    dArray[threadIdx.x] = threadIdx.x;
}

int main( int argc, char** argv)
{
    unsigned __int8 Array[16] = { 0 };
    unsigned __int8 dArray[16];

    for( __int8 Position = 0; Position < 16; Position++)
        cout << Array[Position] << " ";
    cout << endl;

    cudaMalloc((void**) dArray, 16*sizeof(__int8));
    cudaMemcpy( dArray, Array, 16*sizeof(__int8), cudaMemcpyHostToDevice);

    StoreThreadNumber<<<1, 16>>>();

    cudaMemcpy( Array, dArray, 16*sizeof(__int8), cudaMemcpyDeviceToHost);

    for( __int8 Position = 0; Position < 16; Position++)
        cout << Array[Position] << " ";
    cout << endl;

    cudaFree(dArray);
}
4

2 に答える 2

5

__device__タイプまたはのグローバル変数をCUDAに含めることができます__constant__。したがって、たとえば、を__constant__使用してポインタ変数をデバイスポインタのアドレスに初期化するとcudaMemcpyToSymbol()、変数を介してそのポインタにアクセスでき__constant__ます。

__constant__ int* dArrayPtr;

__global__ void StoreThreadNumber()
{
    dArrayPtr[threadIdx.x] = threadIdx.x;
}

カーネルを実行する前に、ホストコードからdArrayPtrを正しく初期化することを確認してください。

于 2011-05-12T01:51:29.380 に答える
2

できません。dArrayへのポインタをカーネルに渡す必要があります。

大量のグローバルデータをGPUに渡さなければならないという同じ問題がありました。私はそれをすべて構造体にまとめて、それへのポインタを渡すことになりました。

于 2011-05-11T11:52:42.547 に答える