0

cudaMemcpy2D を使用して 20 * 20 char 値の 2D 配列をカーネルに送信していますが、20 * 30 の配列を送信しようとするとエラーが発生します。

これらの行のコードは次のとおりです。

次のように定数を定義します。

//Define for 2D arrays
#define TEXTSIZE 20
#define NUMBERTEXT 30

私はこのように私のtextPitchを定義します

size_t pitch_text;

次のように配列を初期化します。

char text[NUMBERTEXT][TEXTSIZE] = {{'A','A','B','C','B','B','C','A','B','A','A','B','B','A','A','A','C','A','A','B'},\ ... }};

私は cudamalloc を次のようにします:

gpuErrchk(cudaMallocPitch( (void**)&d_text, &pitch_text, NUMBERTEXT * sizeof(char), TEXTSIZE));

CudaMemcpy2D は次のように初期化されます。

gpuErrchk(cudaMemcpy2D(d_text, pitch_text, text, TEXTSIZE * sizeof(char), TEXTSIZE * sizeof(char),NUMBERTEXT, cudaMemcpyHostToDevice));

受信したエラーは次のとおりです。

    GPUassert: invalid argument ../2D.cu 212

212 行目のエラーは、基本的に CudaMemcpy2D 行です。

大規模な 2D 配列をグローバル メモリの GPU に送信するより良い方法はありますか? 20 * 20 配列を使用すると、コードが正常に機能することに注意してください。

ありがとうございました

4

1 に答える 1

1

問題は、cudaMallocPitch への呼び出しにあります(cudaMemcpy2Dではありません)。高さと幅のパラメーターを逆にしました。C では、二重添字付きの配列は次のようarray[rows][columns]に宣言されますcolumns(つまり、2 番目の添字) は幅を参照します。

これを修正するには、次の代わりに:

cudaMallocPitch( (void**)&d_text, &pitch_text, NUMBERTEXT * sizeof(char), TEXTSIZE);

これを行う:

cudaMallocPitch( (void**)&d_text, &pitch_text, TEXTSIZE * sizeof(char), NUMBERTEXT);

cudaMallocPitch の最後のパラメーターはRequested pitched allocation height、つまり、rows パラメーターです。

編集:コメントのさらなる質問に答えるために、ここに私がテスト目的で使用していたコードがあります。特にテキスト配列のサイズに関する質問については、このコードでは 90x120 程度までのサイズでセグメンテーション違反を再現できません。したがって、セグメンテーション違反はおそらく別の問題だと思います。

私のテストコード(segfaultしない):

#include <stdio.h>
//Define for 2D arrays
#define TEXTSIZE 90
#define NUMBERTEXT 120

#define cudaCheckErrors(msg) \
    do { \
        cudaError_t __err = cudaGetLastError(); \
        if (__err != cudaSuccess) { \
            fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
                msg, cudaGetErrorString(__err), \
                __FILE__, __LINE__); \
            fprintf(stderr, "*** FAILED - ABORTING\n"); \
            exit(1); \
        } \
    } while (0)

int main(){


  size_t pitch_text;
  char *d_text;
  char text[NUMBERTEXT][TEXTSIZE];

  cudaMallocPitch( (void**)&d_text, &pitch_text, TEXTSIZE * sizeof(char), NUMBERTEXT);
  cudaCheckErrors("cudaMallocPitch error");
  cudaMemcpy2D(d_text, pitch_text, text, TEXTSIZE * sizeof(char), TEXTSIZE * sizeof(char),NUMBERTEXT, cudaMemcpyHostToDevice);
  cudaCheckErrors("cudaMemcpy2D error");

  return 0;
}
于 2013-03-04T19:16:04.933 に答える