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);

据我了解,这应该给我一个 cuArray 中的二维数组,该数组的尺寸为 bmp.width,来自 h_data 中的数据,这是一个尺寸为 bmp.width * bmp.height 的一维数组。不幸的是,它只是在最后一个命令上出现段错误。我做错了什么可怕的事情吗?

4

1 回答 1

2

我认为@lmortenson 是在正确的轨道上,但我们不会将宽度高度乘以sizeof(float),而只是其中之一。

  1. 您需要确保您的bmp.widthbmp.height参数符合此处指定的限制Valid extents。这些范围是元素,而不是字节。
  2. 您需要将宽度和高度参数传递给元素中的cudaMallocArray ,而不是字节。
  3. 您需要将整体大小参数传递给cudaMemcpyToArray以字节为单位,而不是元素,但这通常采用以下形式width*height*sizeof(float)

我根据您的代码创建了一个简单的复制器,并且能够重现 seg 错误。我相信以下代码是我对已修复错误的改编:

#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 回答