@lmortensonは正しい方向に進んでいたと思いますが、幅と高さを乗算するのではなくsizeof(float)
、そのうちの1つだけです。
bmp.width
とパラメータが、ここでbmp.height
指定されている制限に準拠していることを確認する必要があります。これらのエクステントは、バイトではなく要素に含まれます。Valid extents
- バイトではなく要素にあるcudaMallocArrayに幅と高さのパラメーターを渡す必要があります。
- 全体のサイズパラメータを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;
}