0

関数cudaMemcpyToArrayに問題があるようです。次のコマンドがあります。

float *h_data = new float[bmp.width * bmp.height];
...
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
cudaArray *cuArray;
cudaMallocArray(&cuArray, &channelDesc, bmp.width, bmp.height);
cudaMemcpyToArray(cuArray, 0, 0, h_data, bmp.width * bmp.height, cudaMemcpyHostToDevice);

私が理解している限り、これにより、h_dataのデータからbmp.width x bmp.heightの次元を持つcuArrayの2D配列が得られます。これは、bmp.width*bmp.heightの次元の1D配列です。残念ながら、最後のコマンドでセグメンテーション違反が発生します。私はひどく間違ったことをしていますか?

4

1 に答える 1

2

@lmortensonは正しい方向に進んでいたと思いますが、幅高さを乗算するのではなくsizeof(float)、そのうちの1つだけです。

  1. bmp.widthとパラメータが、ここbmp.height指定されている制限に準拠していることを確認する必要があります。これらのエクステントは、バイトではなく要素に含まれます。Valid extents
  2. バイトではなく要素にあるcudaMallocArrayに幅と高さのパラメーターを渡す必要があります。
  3. 全体のサイズパラメータをcudaMemcpyToArrayに渡す必要があります。これは要素ではなくバイト単位ですが、これは通常、次の形式になります。width*height*sizeof(float)

私はあなたのコードに基づいて簡単な再現装置を作成し、セグメンテーション違反を再現することができました。次のコードは、エラーを修正した私の適応でした。

#include <stdio.h>
#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(){
  int width = 256;
  int height = 256;
  float *h_data = new float[width * height];
  cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
  cudaArray *cArray;
  cudaMallocArray(&cArray, &channelDesc, width, height, cudaArrayDefault);
  cudaCheckErrors("cudaMallocArray");
  cudaMemcpyToArray(cArray, 0, 0, h_data, width*height*sizeof(float), cudaMemcpyHostToDevice);
  cudaCheckErrors("cudaMemcpyToArray");
  return 0;
}
于 2013-02-18T05:05:55.230 に答える