C++ 在调试模式下,所有程序运行良好,但在发布模式下,我在cudamaloc操作中出错

C++ 在调试模式下,所有程序运行良好,但在发布模式下,我在cudamaloc操作中出错,c++,c,C++,C,在调试模式下程序运行良好,但在发布模式下有错误memcpy操作 CellBot *hCellList; CellBot *dCellList; size_t CellSize = WorldConst.numberOfCells * sizeof(CellBot); assert(!((hCellList = (CellBot *)malloc(CellSize)) == NULL)); gpuAssert(cudaMalloc(

在调试模式下程序运行良好,但在发布模式下有错误memcpy操作

 CellBot *hCellList;
        CellBot *dCellList;
        size_t CellSize = WorldConst.numberOfCells * sizeof(CellBot);
        assert(!((hCellList = (CellBot *)malloc(CellSize)) == NULL));
        gpuAssert(cudaMalloc((void**)&dCellList, CellSize));


        ::memcpy(hCellList, CellList.data(), CellSize);
        gpuAssert(cudaMemcpy(dCellList, hCellList, CellSize, cudaMemcpyHostToDevice));
对此我没有任何想法。我总是在调试模式下工作,当我决定发布时会出现这样的错误。 程序在此代码行上停止:

::memcpy(hCellList,cellllist.data(),CellSize)

在OgreCu_0.01.exe中的0x00007FFB9820C447(vcruntime140.dll)处引发异常:0xC0000005:访问冲突写入位置0x0000000000000000

Visual studio在memcpy.asm中显示错误 线标记**

 CopyUp:
        cmp     r8, 128
        jbe     XmmCopySmall

        bt      __favor, __FAVOR_ENFSTRG ; check for ENFSTRG (enhanced fast strings)
        jnc     XmmCopyUp               ; If Enhanced Fast String not available, use XMM

        ; use Enhanced Fast Strings
        ; but first align the destination dst to 16 byte alignment
        mov     rax, r11                ; return original destination pointer
        mov     r11, rdi                ; save rdi in r11
        mov     rdi, rcx                ; move destination pointer to rdi
        mov     rcx, r8                 ; move length to rcx
        mov     r8, rsi                 ; save rsi in r8
        mov     rsi, r10                ; move source pointer to rsi
        **rep     movsb                   ; copy source to destination buffer**
        mov     rsi, r8                 ; restore rsi
        mov     rdi, r11                ; restore rdi
        ret
我更改
::memcpy(hCellList,cellllist.data(),CellSize)

for (int e = 0; e < WorldConst.numberOfCells; e++)
    {
        hCellList[e] = CellList[e];
    }
Vec3:

模板
类XVector3
{
公众:
类型定义T值_类型;
__主机设备内联XVector3():x(0.0f),y(0.0f),z(0.0f){}
__主机设备内联XVector3(ta):x(a),y(a),z(a){
__主机设备内联XVector3(常数T*p):x(p[0]),y(p[1]),z(p[2]){
__主机设备内联XVector3(TX,TY,TZ):x(x),y(y),z(z)
{
VEC3_验证();
}
__主机设备内联运算符T*({return&x;}
__主机设备内联运算符const T*()const{return&x;};
__主机\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
__主机设备内联XVector3运算符*(T刻度)常量{XVector3 r(*此);r*=刻度;返回r;VEC3验证();}
__主机设备内联XVector3运算符/(T刻度)常量{XVector3 r(*此);r/=scale;返回r;VEC3验证();}
__主机设备内联XVector3运算符+(const XVector3&v)const{XVector3 r(*this);r+=v;返回r;VEC3_VALIDATE();}
__主机设备内联XVector3运算符-(const XVector3&v)const{XVector3 r(*this);r-=v;返回r;VEC3_VALIDATE();}
__主机设备内联XVector3运算符/(const XVector3&v)const{XVector3 r(*this);r/=v;返回r;VEC3\u VALIDATE();}
__主机设备内联XVector3运算符*(const XVector3&v)const{XVector3 r(*此);r*=v;返回r;VEC3_VALIDATE();}
__主机设备内联XVector3和运算符*=(T scale){x*=scale;y*=scale;z*=scale;VEC3\u VALIDATE();返回*this;}
__主机设备内联XVector3和运算符/=(T刻度){ts(1.0f/刻度);x*=s;y*=s;z*=s;VEC3\u验证();返回*this;}
__主机设备内联XVector3&operator+=(const XVector3&v){x+=v.x;y+=v.y;z+=v.z;VEC3_VALIDATE();返回*this;}
__主机设备内联XVector3和运算符-=(常量XVector3&v){x-=v.x;y-=v.y;z-=v.z;VEC3\u验证();返回*this;}
__主机设备内联XVector3&operator/=(const XVector3&v){x/=v.x;y/=v.y;z/=v.z;VEC3_VALIDATE();返回*this;}
__主机设备内联XVector3和运算符*=(常量XVector3&v){x*=v.x;y*=v.y;z*=v.z;VEC3\u验证();返回*this;}
__主机设备内联布尔运算符!=(const XVector3&v)const{return(x!=v.x | | | y!=v.y | | z!=v.z)}
//否定
__主机设备内联XVector3运算符-()常量{VEC3_VALIDATE();返回XVector3(-x,-y,-z);}
__主机\设备\无效验证()
{
VEC3_验证();
}
tx,y,z;
};
类型def XVector3 Vec3;
类型定义XVector3矢量3;
//lhs标量标度
模板
__主机设备矢量3操作员*(T lhs、常数矢量3和rhs)
{
XVector3 r(rhs);
r*=lhs;
返回r;
}
模板
__主机设备布尔运算符==(常量XVector3和lhs、常量XVector3和rhs)
{
返回(lhs.x==rhs.x&&lhs.y==rhs.y&&lhs.z==rhs.z);
}

你的问题很难理解。请写一个更完整的错误消息,并解释你下次要做什么

然而,我猜想您会遇到以下问题:
assert
语句速度慢,因此通常只在调试模式下编译到代码中。在发布模式中,它们通常被忽略

然而,在您的代码中,您正在
断言中使用
malloc
。因此,在调试版本中,您可以获得所需的内存,而在发布版本中,您什么也得不到,程序就会崩溃。电话是:

assert(!((hCellList = (CellBot *)malloc(CellSize)) == NULL));
你应该做的是:

hCellList = (CellBot *)malloc(CellSize);
assert(!(hCellList == NULL));

什么错误?我们必须猜测吗?你应该提供一个see item 1@TALONMES,尝试显示所有信息。这是你的主机代码中的问题,而不是CUDA中的问题。我相信需要一个完整的测试来取得进一步的进展,因为问题很可能发生在您没有展示的代码中。我猜在你展示任何东西之前,有什么东西已经冲洗过了。这将是99%的肯定,这与CUDA在allI删除断言(!从程序在所有。和程序前进,但显示下一个错误与食人魔引擎。谢谢!
assert(!((hCellList = (CellBot *)malloc(CellSize)) == NULL));
hCellList = (CellBot *)malloc(CellSize);
assert(!(hCellList == NULL));