Parallel processing 内核在尝试执行简单的值赋值时崩溃

Parallel processing 内核在尝试执行简单的值赋值时崩溃,parallel-processing,cuda,Parallel Processing,Cuda,我正在学习CUDA,还处于非常初级的水平。我正在尝试一个简单的任务,但当我运行它时,我的代码崩溃了,我不知道为什么。任何帮助都将不胜感激 编辑:在cudaMemcpy上崩溃,在图像结构中,pixelVal的类型为int**。这就是原因吗 原始C++代码: void Image::reflectImage(bool flag, Image& oldImage) /*Reflects the Image based on users input*/ { int rows = oldI

我正在学习CUDA,还处于非常初级的水平。我正在尝试一个简单的任务,但当我运行它时,我的代码崩溃了,我不知道为什么。任何帮助都将不胜感激

编辑:
cudaMemcpy
上崩溃,在
图像
结构中,
pixelVal
的类型为
int**
。这就是原因吗

原始C++代码:

void Image::reflectImage(bool flag, Image& oldImage)
/*Reflects the Image based on users input*/
{
    int rows = oldImage.N;
    int cols = oldImage.M;
    Image tempImage(oldImage);

    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        tempImage.pixelVal[rows - (i + 1)][j] = oldImage.pixelVal[i][j];
    }
    oldImage = tempImage;
}
void Image::reflectmage(布尔标志、图像和旧图像)
/*根据用户输入反映图像*/
{
int rows=oldImage.N;
int cols=oldImage.M;
图像tempImage(旧图像);
对于(int i=0;i
我的CUDA内核和代码:

#define NTPB 512
__global__ void fliph(int* a, int* b, int r, int c)
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    int j = blockIdx.y * blockDim.y + threadIdx.y;

    if (i >= r || j >= c)
        return;
    a[(r - i * c) + j] = b[i * c + j];
}
void Image::reflectImage(bool flag, Image& oldImage)
/*Reflects the Image based on users input*/
{
    int rows = oldImage.N;
    int cols = oldImage.M;
    Image tempImage(oldImage);
    if(flag == true) //horizontal reflection
    {
     //Allocate device memory
     int* dpixels;
     int* oldPixels;
     int n = rows * cols;
     cudaMalloc((void**)&dpixels, n * sizeof(int));
     cudaMalloc((void**)&oldPixels, n * sizeof(int));
     cudaMemcpy(dpixels, tempImage.pixelVal, n * sizeof(int), cudaMemcpyHostToDevice);
     cudaMemcpy(oldPixels, oldImage.pixelVal, n * sizeof(int), cudaMemcpyHostToDevice);
     int nblks = (n + NTPB - 1) / NTPB;
     fliph<<<nblks, NTPB>>>(dpixels, oldPixels, rows, cols);
     cudaMemcpy(tempImage.pixelVal, dpixels, n * sizeof(int), cudaMemcpyDeviceToHost);
     cudaFree(dpixels);
     cudaFree(oldPixels);
    }
    oldImage = tempImage;
}
#定义NTPB 512
__全局无效翻转(int*a,int*b,int r,int c)
{
int i=blockIdx.x*blockDim.x+threadIdx.x;
int j=blockIdx.y*blockDim.y+threadIdx.y;
如果(i>=r | | j>=c)
返回;
a[(r-i*c)+j]=b[i*c+j];
}
无效图像::反射图像(布尔标志、图像和旧图像)
/*根据用户输入反映图像*/
{
int rows=oldImage.N;
int cols=oldImage.M;
图像tempImage(旧图像);
if(flag==true)//水平反射
{
//分配设备内存
int*dpixels;
整数*旧像素;
int n=行*列;
cudamaloc((void**)和dpixels,n*sizeof(int));
cudamaloc((void**)和oldPixels,n*sizeof(int));
cudaMemcpy(dpixels,tempImage.pixelVal,n*sizeof(int),cudamemcpyhostodevice);
cudaMemcpy(oldPixels,oldImage.pixelVal,n*sizeof(int),cudaMemcpyHostToDevice);
int nblks=(n+NTPB-1)/NTPB;
翻转(dpixels、oldpoixels、rows、cols);
cudaMemcpy(tempImage.pixelVal,dpixels,n*sizeof(int),cudaMemcpyDeviceToHost);
cudaFree(dpixels);
cudaFree(旧像素);
}
oldImage=tempImage;
}

为了使用2D索引
i
j
处理图像,必须创建2D网格。在当前情况下,内核只处理图像的第一行

要创建二维索引机制,请创建二维块和二维栅格,如下所示:

const int BLOCK_DIM = 16;

dim3 Block(BLOCK_DIM,BLOCK_DIM);

dim3 Grid;
Grid.x = (cols + Block.x - 1)/Block.x;
Grid.y = (rows + Block.y - 1)/Block.y;

fliph<<<Grid, Block>>>(dpixels, oldPixels, rows, cols);
const int BLOCK_DIM=16;
dim3块(块尺寸,块尺寸);
dim3网格;
Grid.x=(cols+Block.x-1)/Block.x;
Grid.y=(rows+Block.y-1)/Block.y;
翻转(dpixels、oldpoixels、rows、cols);

您的块和网格是1D。为什么在内核中使用2D索引。变量
j
在内核中总是0。通过快速查看,代码看起来没有问题(除了@sgar91注释)。我建议您为您的程序提供错误检查,以进一步说明您的问题。看这篇文章。我数了7次CUDAAPI调用,没有看到任何错误检查!第一步:检查错误并尝试在问题产生的地方缩小范围。@bRugeshpatel:你说它在
memcpy
上崩溃了。但是该代码中没有
memcpy
调用。你是说
cudaMemcpy
?其中有三个。哪一个?细节在这里很重要。帮助我们帮助你…@Talonmes是的,我是说cudaMemcpy。它在第一个cudaMemcpy就崩溃了。cudaMemcpy(dpixels,tempImage.pixelVal,n*sizeof(int),cudamemcpyhostodevice);