从设备复制到主机时发生CUDA未知错误

从设备复制到主机时发生CUDA未知错误,cuda,Cuda,我写了一些CUDA代码,在我尝试从代码中获得结果之前,一切看起来都很棒: #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <cstdlib> #include <ctime> #include <iostream> #define maskSize 3 __constant__ float masks[32*maskSize*maskSize]; __

我写了一些CUDA代码,在我尝试从代码中获得结果之前,一切看起来都很棒:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cstdlib> 
#include <ctime> 
#include <iostream>

#define maskSize 3 

__constant__ float masks[32*maskSize*maskSize];

__global__ void myConv(float *res, const float* mats, int mSize)
{
    extern __shared__ float curr[];
    int rSize=maskSize+mSize-1;
    int idxmod=(threadIdx.x+maskSize-1) % (mSize+2*maskSize-2); //these two map any value not within (mSize-1,mSize-1) to the boarders for padding.
    int idymod=(threadIdx.y+maskSize-1) % (mSize+2*maskSize-2);
    if (threadIdx.x < mSize && threadIdx.y < mSize) //put the value of mats in the middle of the curr matrix
        curr[(threadIdx.x+ maskSize-1)*(mSize+2*(maskSize-1)) + threadIdx.y + maskSize-1]=mats[mSize*(blockIdx.y*mSize + threadIdx.x) + threadIdx.y];
    else //zero padding
        if (threadIdx.x < mSize)
            curr[threadIdx.x*(mSize+2*(maskSize-1)) +idymod] =0;
        else 
            curr[idxmod*(mSize+2*(maskSize-1)) +threadIdx.y] =0;

    __syncthreads();
    float tmp=0;

if (threadIdx.x < mSize+maskSize-1 && threadIdx.y < mSize+maskSize-1)
{
#pragma unroll
    for (int i=0;i<maskSize;i++)
        #pragma unroll
        for (int j=0;j<maskSize;j++)

            tmp+=curr[(threadIdx.x+i)*(mSize+2*(maskSize-1)) + threadIdx.y+j]*masks[blockIdx.x*maskSize*maskSize +maskSize*i +j];
    res[blockIdx.y*rSize*rSize + threadIdx.x*rSize + threadIdx.y]=tmp;
}
}

int main()
{
    int MatSize=5;
    int bSize=2000;
    int maskNum=10;
    int resSize=MatSize+maskSize-1;
    float* ms;
    ms=(float *)malloc(maskSize*maskSize*maskNum*sizeof(float));
    float* resPtr=(float *)malloc((MatSize+maskSize-1)*(MatSize+maskSize-1)*bSize*maskNum*sizeof(float));
    for (int i=0; i<maskSize;i++)
        for (int j=0; j<maskSize; j++)
            for (int k=0; k<maskNum; k++)
                ms[k*maskSize*maskSize + j*maskSize + i]=(float)(rand() % 1000)/100;
    float* inp=(float *)malloc(MatSize*MatSize*bSize*sizeof(float));
    for (int i=0; i<MatSize; i++)
        for (int j=0; j<MatSize; j++)
            for (int k=0;k<bSize;k++)
                inp[k*MatSize*MatSize + j*MatSize + i]=(float)(rand() % 500)/100;
    float *cudams, *cudaresPtr,*cudainp;
    cudaMalloc((void **) &cudams,maskSize*maskSize*maskNum*sizeof(float));
    cudaMalloc((void **) &cudaresPtr,(MatSize+maskSize-1)*(MatSize+maskSize-1)*bSize*maskNum*sizeof(float));
    cudaMalloc((void **) &cudainp,MatSize*MatSize*bSize*sizeof(float));

    cudaMemcpy((void *)cudams,(void *)ms,maskSize*maskSize*maskNum*sizeof(float),cudaMemcpyHostToDevice);

    cudaMemcpy((void *)cudainp,(void *)inp,MatSize*MatSize*bSize*sizeof(float),cudaMemcpyHostToDevice);

    cudaMemcpyToSymbol(masks,(void *)cudams,maskSize*maskSize*maskNum*sizeof(float),0,cudaMemcpyDeviceToDevice);
    dim3 threadSize(MatSize+2*(maskSize-1),MatSize+2*(maskSize-1));
    dim3 blockSize(1, 1); //for testing purposes. should be dim3 blockSize(maskNum,bSize);
    myConv<<<blockSize, threadSize, (MatSize+2*(maskSize-1))*(MatSize+2*(maskSize-1))>>>(cudaresPtr,cudainp,MatSize);
    cudaMemcpy((void *)resPtr,(const void *)cudaresPtr,(MatSize+maskSize-1)*(MatSize+maskSize-1)*bSize*maskNum*sizeof(float),cudaMemcpyDeviceToHost);
    //The problem is here - They copying won't work!

    free(inp);
    free(ms);
    free(resPtr);
    return 0;
}
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
#包括
#包括
#定义掩码3
__常量浮点数掩码[32*maskSize*maskSize];
__全局无效myConv(浮点*res,常量浮点*mats,整数mSize)
{
外部共享浮动货币[];
int rSize=maskSize+mSize-1;
int-idxmod=(threadIdx.x+maskSize-1)%(mSize+2*maskSize-2);//这两个值将(mSize-1,mSize-1)之外的任何值映射到填充板。
int-idymod=(threadIdx.y+maskSize-1)%(mSize+2*maskSize-2);
如果(SudiDax.x<MyS& & SudiAddix.y<MySIZE)/ /将矩阵的值放在Curr矩阵的中间
curr[(threadIdx.x+maskSize-1)*(mSize+2*(maskSize-1))+threadIdx.y+maskSize-1]=mats[mSize*(blockIdx.y*mSize+threadIdx.x)+threadIdx.y];
else//零填充
if(threadIdx.x对于(inti=0;i来说,您(至少)在启动内核时,动态分配的共享内存不足,无法在内核中运行而不会出现缓冲区溢出

每个块的共享内存量是以字节为单位的,因此我怀疑您想要的是:

size_t shmsz = sizeof(float)*size_t((MatSize+2*(maskSize-1))*
                                    (MatSize+2*(maskSize-1));
myConv<<<blockSize, threadSize, shmz)>>>(cudaresPtr,cudainp,MatSize);
size\u t shmsz=sizeof(float)*size\u t((MatSize+2*(maskSize-1))*
(MatSize+2*(maskSize-1));
myConv(cudaresPtr、cudainp、MatSize);

除此之外,我将调试留给您。

尝试使用cuda memcheck运行您的代码。您的内核中可能有越界访问权限。完成。没有错误报告,我已根据编辑我的问题。您是否可以编辑其他人可能编译并运行到您的问题的最短、完整的示例?很可能这是一个错误内核中的错误(参见示例)。我建议严格按照中所述的错误检查,它将为您提供有关错误源的更精确信息。完成。我尝试了前面提到的错误检查,但唯一导致我出错的是在内核完成后尝试将内容复制回主机。mac使用的函数ro打印了一些文本,但即使我注释掉了if(abort)行,它仍然在我看到打印内容之前退出。@user1999728:您的代码遗漏的关键是在内核启动后进行彻底的错误检查。请查看我回答中的第二个代码段。
cudaPeekAtLastError();cudaDeviceSynchronize()
模式将内核参数错误、内核执行错误和后续API错误隔离开来。