C++ 具有大阵列的cudaMemcpy2D错误

C++ 具有大阵列的cudaMemcpy2D错误,c++,cuda,C++,Cuda,我尝试使用cudamallocitch和cudaMemcpy2D,但当我尝试对大型阵列使用cudaMemcpy2D时,遇到了一个问题: 分段故障 这是可运行的源代码,没有错误 #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <iostream> #include <random> #define ROW_SIZE 32 #define COL_SIZE 1024 int

我尝试使用
cudamallocitch
cudaMemcpy2D
,但当我尝试对大型阵列使用
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;
}
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
#包括
#定义行大小为32
#定义列大小1024
int main()
{
浮球试验;
pfTest=(浮动**)malloc(行大小*浮动大小*);
对于(int i=0;i
正如你所看到的,根本没有问题。 但是,当我试图将
COL_SIZE
扩展到大约
500000
(确切地说是524288)时,它因分段错误而崩溃


有关问题来源的任何帮助?

cudaMemcpy2D
只能用于复制倾斜线性内存。源数组不是倾斜线性内存,而是指针数组。这是不受支持的,并且是SEGFULT的来源

试着这样做:

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);
float*缓冲区;
浮球试验;
常量大小缓冲间距=大小(列大小)*大小(浮动);
缓冲区=(浮点*)malloc(大小\u t(行大小)*缓冲区\u间距);
pfTest=(浮动**)malloc(行大小*浮动大小*);
对于(大小i=0;i<行大小;i++){
pfTest[i]=缓冲区+i*大小(列大小);
}
// ...
cudaMallocPitch(&dev_Test,&pitch,buffer_pitch,ROW_SIZE);
cudaMemcpy2D(开发测试、音高、缓冲器、缓冲器音高、,
缓冲区间距、行大小、cudaMemcpyHostToDevice);
[注:在浏览器中编写,从未测试或编译,使用风险自负]


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

cudaMemcpy2D
只能用于复制倾斜线性内存。源数组不是倾斜线性内存,而是指针数组。这是不受支持的,并且是SEGFULT的来源

试着这样做:

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);
float*缓冲区;
浮球试验;
常量大小缓冲间距=大小(列大小)*大小(浮动);
缓冲区=(浮点*)malloc(大小\u t(行大小)*缓冲区\u间距);
pfTest=(浮动**)malloc(行大小*浮动大小*);
对于(大小i=0;i<行大小;i++){
pfTest[i]=缓冲区+i*大小(列大小);
}
// ...
cudaMallocPitch(&dev_Test,&pitch,buffer_pitch,ROW_SIZE);
cudaMemcpy2D(开发测试、音高、缓冲器、缓冲器音高、,
缓冲区间距、行大小、cudaMemcpyHostToDevice);
[注:在浏览器中编写,从未测试或编译,使用风险自负]

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