0

我想将一个双指针对象复制到主机并在 GPU 设备上对其进行计算。当对设备执行 cudaMemcpy 时,它会抛出 SEGFAULT。

BMP Input;
Input.ReadFromFile( fileName );
WIDTH = Input.TellWidth();
HEIGHT = Input.TellHeight();
RGBApixel** imageData = new RGBApixel* [HEIGHT];
for (int i = 0; i < HEIGHT; i++) 
    imageData[i] = new RGBApixel [WIDTH];

for(int j=0;j<Input.TellHeight();j++){
    for(int i=0;i<Input.TellWidth();i++){
      imageData[j][i] = Input.GetPixel(i,j);
    }
  }
long long imageSize = WIDTH*HEIGHT*sizeof(RGBApixel *);

RGBApixel** dev_imgdata,dev_imgdata_out;
//Allocating cudaMemory
cudaMalloc( (void **) &dev_imgdata, imageSize );
cudaMalloc( (void **) &dev_imgdata_out, imageSize );

现在下面的行抛出段错误

cudaMemcpy(dev_imgdata,imageData,imageSize,cudaMemcpyHostToDevice);
4

2 回答 2

1

声明时,RGBApixel** imageData = new RGBApixel* [HEIGHT];您绝对不能保证 imageData 将占用连续的内存块。

cudaMemcpy将连续的内存块复制到设备 RAM 中。您的语句尝试复制每个矩阵行的起始地址,而不是实际数据。此外,在使用 cudaMalloc 时,您需要为每一行正确分配,就像您为主机缓冲区所做的那样。

您需要做的是将imageData 声明为 RGMAPixel* - 基本上将矩阵放在单个向量中并使用适当的索引,它会起作用。

您也可以一次复制每一行,但这不是一个很好的做法,因为每次内存访问都需要额外的间接访问,并且会破坏缓存效率

于 2014-11-16T13:32:19.717 回答
0

此外,请确保在编译程序时使用 -arch sm_20 为显卡启用额外选项(如果它具有 Capability 2.0)。没有它我相信你不能使用 double 并且结果是不可预测的(或者 double 减少到浮动)

于 2014-11-17T07:23:06.497 回答