0

CUDA API を使用して、計算機能 1.3 GPU でカーネルを実行しようとしています。1 次元配列のバインドは期待どおりに機能しますが、次のコードではエラーが発生します。

#include <cuda.h>
#include <stdio.h>
#include <stdlib.h>

#define checkCudaErrors(err)           __checkCudaErrors (err, __FILE__, __LINE__)

inline static void __checkCudaErrors( cudaError err, const char *file, const int line )     {

    if( cudaSuccess != err) {
        fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n", file, line, (int)err, cudaGetErrorString( err ) );
        exit(-1);
    }
}

texture<int, cudaTextureType2D> tex_transition;

int main ( void ) {

    int m = 8, p_size = 100, alphabet = 20;

    size_t pitch;

    int *transition = ( int * ) malloc ( ( m * p_size + 1 ) * alphabet * sizeof ( int ) );
    memset ( transition, -1, ( m * p_size + 1 ) * alphabet * sizeof ( int ) );

    int *d_transition;

    checkCudaErrors ( cudaMallocPitch ( &d_transition, &pitch, alphabet * sizeof ( int ), ( m * p_size + 1 ) ) );

    checkCudaErrors ( cudaMemcpy2D ( d_transition, pitch, transition, alphabet * sizeof ( int ), alphabet * sizeof ( int ), ( m * p_size + 1 ), cudaMemcpyHostToDevice ) );

    cudaChannelFormatDesc desc = cudaCreateChannelDesc<int>();
    checkCudaErrors ( cudaBindTexture2D ( 0, tex_transition, d_transition, desc, alphabet * sizeof ( int ), ( m * p_size + 1 ), pitch ) );

    cudaFree ( d_transition );

    return 0;
}

実行すると、「test.cu(33) : CUDA ランタイム API エラー 11: 引数が無効です。」というエラーが表示されます。アルファベットを 10 に設定すると、エラーはなくなります。私が間違っていなければ、テクスチャにバインドされた各配列の最大サイズは 65000 x 65000 ワード (この場合は整数) ですが、トランジション配列ははるかに小さいです。

4

1 に答える 1

2

cudaBindTexture2D 呼び出しの引数の 1 つが間違っています。テクスチャのサイズはバイトではなくテクセル単位であるため、呼び出しは次のようになります。

cudaChannelFormatDesc desc = cudaCreateChannelDesc<int>();
cudaBindTexture2D ( 0, 
                    tex_transition, 
                    d_transition, desc, 
                    alphabet,            // in texels
                    ( m * p_size + 1 ),  // in texels
                    pitch );

バイト幅は、割り当て呼び出しでのみ必要です。テクスチャ バインドは、pitch 引数を使用して、2D 割り当てのメモリ レイアウトを計算します。

于 2012-11-28T16:37:59.233 に答える