1

.h ファイル:

#define VECTOR_SIZE 1024   

.cpp ファイル:

int main ()
{
    unsigned int* A;
    A = new unsigned int [VECTOR_SIZE];

    CopyToDevice (A);
}

.cu ファイル:

void CopyToDevice (unsigned int *A)
{
    ulong4 *UA
    unsigned int VectorSizeUlong4 = VECTOR_SIZE / 4;
    unsigned int VectorSizeBytesUlong4 = VectorSizeUlong4 * sizeof(ulong4);

    cudaMalloc( (void**)&UA, VectorSizeBytesUlong4 );

    // how to use cudaMemcpy to copy data from A to UA?

    // I tried to do the following but it gave access violation error:
    for (int i=0; i<VectorSizeUlong4; ++i)
    {
        UA[i].x = A[i*4 + 0];
        UA[i].y = A[i*4 + 1];
        UA[i].z = A[i*4 + 2];
        UA[i].w = A[i*4 + 3];
    }
    // I also tried to copy *A to device and then work on it instead going back to CPU to access *A every time but this did not work again
}

ここに画像の説明を入力

4

2 に答える 2

3

CUDAulong4は、次のように定義された 16 バイトにアラインされた構造です。

struct __builtin_align__(16) ulong4
{
  unsigned long int x, y, z, w;
};

これは、ストリームに入力するために使用する 4 つの連続する 32 ビット符号なしソース整数のストリームがulong4同じサイズであることを意味します。最も簡単な解決策は、投稿した画像のテキストに含まれています-ポインターを(暗黙的または明示的に)unsigned intポインターにキャストし、ホストとデバイスのメモリで直接ulong4使用cudaMemcpyし、結果のデバイスポインターをカーネル関数に渡します入力が必要ulong4です。デバイスの伝達関数は次のようになります。

ulong4* CopyToDevice (unsigned int* A)
{
    ulong4 *UA, *UA_h;
    size_t VectorSizeUlong4 = VECTOR_SIZE / 4;
    size_t VectorSizeBytesUlong4 = VectorSizeUlong4 * sizeof(ulong4);

    cudaMalloc( (void**)&UA, VectorSizeBytesUlong4);
    UA_h = reinterpret_cast<ulong4*>(A); // not necessary but increases transparency
    cudaMemcpy(UA, UA_h, VectorSizeBytesUlong4);

    return UA;   
}

[通常の免責事項: ブラウザーで記述されており、テストもコンパイルもされていないため、自己責任で使用してください]

于 2013-11-04T10:59:11.697 に答える
2

これにより、すべての警鐘が鳴るはずです。

cudaMalloc( (void**)&UA, VectorSizeBytesUlong4 );
// ...
UA[i].x = A[i*4 + 0];

デバイスに UA を割り当て、それをホスト コードで使用します。そんなことは絶対にしないでください。cudaMemcpyアレイをデバイスにコピーするには、を使用する必要があります。このチュートリアルでは、cudaMemcpy を使用してコピーする基本的なプログラムを示します。cudaMemcpy の length 引数は、配列の長さ (バイト単位) です。そして、あなたの場合はVECTOR_SIZE * sizeof(unsigned int).

于 2013-11-04T03:25:26.637 に答える