【问题标题】:cudaMemcpy2D error with large array大数组的 cudaMemcpy2D 错误
【发布时间】:2016-03-07 20:28:55
【问题描述】:

我尝试使用cudaMallocPitchcudaMemcpy2D,但是当我尝试将cudaMemcpy2D与大数组一起使用时,我遇到了问题:

分段错误

这是可运行的源代码,没有错误。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <iostream>
#include <random>

#define ROW_SIZE 32
#define COL_SIZE 1024

int main()
{
    float ** pfTest;
    pfTest = (float**)malloc(ROW_SIZE * sizeof(float*));
    for (int i = 0; i < ROW_SIZE; i++) {
        pfTest[i] = (float*)malloc(COL_SIZE * sizeof(float));
    }

    std::default_random_engine generator;
    std::uniform_real_distribution<float> distribution;

    for (int y = 0; y < ROW_SIZE; y++) {
        for (int x = 0; x < COL_SIZE; x++) {
            pfTest[y][x] = distribution(generator);
        }
    }   

    float *dev_Test;
    size_t pitch;
    cudaMallocPitch(&dev_Test, &pitch, COL_SIZE * sizeof(float), ROW_SIZE);
    cudaMemcpy2D(dev_Test, pitch, pfTest, COL_SIZE * sizeof(float), COL_SIZE * sizeof(float),  ROW_SIZE, cudaMemcpyHostToDevice);
    printf("%s\n", cudaGetErrorString(cudaGetLastError()));

    return 0;
}

如您所见,完全没有问题。 但是,当我尝试将 COL_SIZE 扩展到 500,000 左右(确切地说,524288)时,它会因分段错误而崩溃。

关于问题根源的任何帮助?

【问题讨论】:

    标签: c++ cuda


    【解决方案1】:

    cudaMemcpy2D 只能用于复制音高线性内存。您的源数组是 not 间距线性内存,它是一个指针数组。这不受支持,并且是段错误的来源。

    试试这样的:

    float*  buffer;
    float** pfTest;
    const size_t buffer_pitch = size_t(COL_SIZE) * sizeof(float); 
    buffer = (float*)malloc(size_t(ROW_SIZE) * buffer_pitch);
    pfTest = (float**)malloc(ROW_SIZE * sizeof(float*));
    for (size_t i = 0; i < ROW_SIZE; i++) {
        pfTest[i] = buffer + i * size_t(COL_SIZE);
    }
    
    // ...
    
    cudaMallocPitch(&dev_Test, &pitch, buffer_pitch, ROW_SIZE);
    cudaMemcpy2D(dev_Test, pitch, buffer, buffer_pitch, 
                   buffer_pitch, ROW_SIZE, cudaMemcpyHostToDevice);
    

    [注意:在浏览器中编写,从未测试或编译,使用风险自负]

    即将要复制的数据存储在单个连续内存分配中,该内存分配可以充当 cudaMemcpy2D 的倾斜线性源。如果您坚持在主机上使用[][] 样式索引,那么您必须支付额外的指针数组与数据一起存储的代价。请注意,这实际上不是必需的,您可以直接索引到 buffer 并获得相同的结果,同时节省内存。

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2018-08-15
      相关资源
      最近更新 更多