tensorrtx icon indicating copy to clipboard operation
tensorrtx copied to clipboard

win10 compile yolov8 happen:yololayer.cu(262): error : expression must have a constant value

Open cronousbaby opened this issue 1 year ago • 12 comments

在win10下编译 tensorrtx-yolov8 出现如下错误: 【1】、 2>J:\tensorrtx\yolov8\plugin\yololayer.cu(262): error : expression must have a constant value 2>J:\tensorrtx\yolov8\plugin\yololayer.cu(262): note #2689-D: the value of variable "maxGrids" 2>(261): here cannot be used as a constant 【2】、 C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\BuildCustomizations\CUDA 11.7.targets(790,9): error MSB3721: 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin\nvcc.exe" --use-local-env -ccbin "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\HostX64\x64" -x cu -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" -IJ:\tensorrtx\yolov8\include -I"I:\TensorRT-8.6.1.6\include" -I"I:\TensorRT-8.6.1.6\samples\common" -IJ:\tensorrtx\yolov8\plugin -II:\opencv\build\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" --keep-dir myplugins\x64\Release -maxrregcount=0 --machine 64 --compile -cudart static -std=c++11 -Xcompiler="/EHsc -Ob2" -D_WINDOWS -DNDEBUG -DAPI_EXPORTS -D"CMAKE_INTDIR="Release"" -Dmyplugins_EXPORTS -D_WINDLL -D_MBCS -D"CMAKE_INTDIR="Release"" -Dmyplugins_EXPORTS -Xcompiler "/EHsc /W3 /nologo /O2 /Fdmyplugins.dir\Release\vc143.pdb /FS /MD /GR" -o myplugins.dir\Release\yololayer.obj "J:\tensorrtx\yolov8\plugin\yololayer.cu"”已退出,返回代码为 1。

cronousbaby avatar May 10 '24 18:05 cronousbaby

@lindsayshuo Pls advice.

wang-xinyu avatar May 11 '24 02:05 wang-xinyu

在win10下编译 tensorrtx-yolov8 出现如下错误: 【1】、 2>J:\tensorrtx\yolov8\plugin\yololayer.cu(262): error : expression must have a constant value 2>J:\tensorrtx\yolov8\plugin\yololayer.cu(262): note #2689-D: the value of variable "maxGrids" 2>(261): here cannot be used as a constant 【2】、 C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\BuildCustomizations\CUDA 11.7.targets(790,9): error MSB3721: 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin\nvcc.exe" --use-local-env -ccbin "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\HostX64\x64" -x cu -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" -IJ:\tensorrtx\yolov8\include -I"I:\TensorRT-8.6.1.6\include" -I"I:\TensorRT-8.6.1.6\samples\common" -IJ:\tensorrtx\yolov8\plugin -II:\opencv\build\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" --keep-dir myplugins\x64\Release -maxrregcount=0 --machine 64 --compile -cudart static -std=c++11 -Xcompiler="/EHsc -Ob2" -D_WINDOWS -DNDEBUG -DAPI_EXPORTS -D"CMAKE_INTDIR="Release"" -Dmyplugins_EXPORTS -D_WINDLL -D_MBCS -D"CMAKE_INTDIR="Release"" -Dmyplugins_EXPORTS -Xcompiler "/EHsc /W3 /nologo /O2 /Fdmyplugins.dir\Release\vc143.pdb /FS /MD /GR" -o myplugins.dir\Release\yololayer.obj "J:\tensorrtx\yolov8\plugin\yololayer.cu"”已退出,返回代码为 1。

我在ubuntu22里面编译不报错呢

lindsayshuo avatar May 11 '24 03:05 lindsayshuo

在win10下编译 tensorrtx-yolov8 出现如下错误: 【1】、 2>J:\tensorrtx\yolov8\plugin\yololayer.cu(262): error : expression must have a constant value 2>J:\tensorrtx\yolov8\plugin\yololayer.cu(262): note #2689-D: the value of variable "maxGrids" 2>(261): here cannot be used as a constant 【2】、 C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\BuildCustomizations\CUDA 11.7.targets(790,9): error MSB3721: 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin\nvcc.exe" --use-local-env -ccbin "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\HostX64\x64" -x cu -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" -IJ:\tensorrtx\yolov8\include -I"I:\TensorRT-8.6.1.6\include" -I"I:\TensorRT-8.6.1.6\samples\common" -IJ:\tensorrtx\yolov8\plugin -II:\opencv\build\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" --keep-dir myplugins\x64\Release -maxrregcount=0 --machine 64 --compile -cudart static -std=c++11 -Xcompiler="/EHsc -Ob2" -D_WINDOWS -DNDEBUG -DAPI_EXPORTS -D"CMAKE_INTDIR="Release"" -Dmyplugins_EXPORTS -D_WINDLL -D_MBCS -D"CMAKE_INTDIR="Release"" -Dmyplugins_EXPORTS -Xcompiler "/EHsc /W3 /nologo /O2 /Fdmyplugins.dir\Release\vc143.pdb /FS /MD /GR" -o myplugins.dir\Release\yololayer.obj "J:\tensorrtx\yolov8\plugin\yololayer.cu"”已退出,返回代码为 1。

我在ubuntu22里面编译不报错呢

你用的最新版本吗

lindsayshuo avatar May 11 '24 03:05 lindsayshuo

在win10下编译 tensorrtx-yolov8 出现如下错误: 【1】、 2>J:\tensorrtx\yolov8\plugin\yololayer.cu(262): error : expression must have a constant value 2>J:\tensorrtx\yolov8\plugin\yololayer.cu(262): note #2689-D: the value of variable "maxGrids" 2>(261): here cannot be used as a constant 【2】、 C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\BuildCustomizations\CUDA 11.7.targets(790,9): error MSB3721: 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin\nvcc.exe" --use-local-env -ccbin "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\bin\HostX64\x64" -x cu -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" -IJ:\tensorrtx\yolov8\include -I"I:\TensorRT-8.6.1.6\include" -I"I:\TensorRT-8.6.1.6\samples\common" -IJ:\tensorrtx\yolov8\plugin -II:\opencv\build\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include" --keep-dir myplugins\x64\Release -maxrregcount=0 --machine 64 --compile -cudart static -std=c++11 -Xcompiler="/EHsc -Ob2" -D_WINDOWS -DNDEBUG -DAPI_EXPORTS -D"CMAKE_INTDIR="Release"" -Dmyplugins_EXPORTS -D_WINDLL -D_MBCS -D"CMAKE_INTDIR="Release"" -Dmyplugins_EXPORTS -Xcompiler "/EHsc /W3 /nologo /O2 /Fdmyplugins.dir\Release\vc143.pdb /FS /MD /GR" -o myplugins.dir\Release\yololayer.obj "J:\tensorrtx\yolov8\plugin\yololayer.cu"”已退出,返回代码为 1。

确保你的 CUDA Toolkit 和对应的 Visual Studio 插件版本相兼容,有时候版本不匹配也会导致编译错误。如果你不确定,可以检查 NVIDIA 官方文档,了解你的 CUDA Toolkit 版本支持的 Visual Studio 版本。

lindsayshuo avatar May 11 '24 03:05 lindsayshuo

谢谢答复,我晚上再试验一下

cronousbaby avatar May 11 '24 11:05 cronousbaby

谢谢答复,我晚上再试验一下

请问你解决了吗,我遇到同样问题

manfrey666 avatar May 13 '24 08:05 manfrey666

谢谢答复,我晚上再试验一下

请问你解决了吗,我遇到同样问题

好像是 mStridesLength 不能在编译时确定的问题 我对 yololayer.cu 做了如下修改后不报错了:

    //const int maxGrids = mStridesLength;
    //int grids[maxGrids][2];
    //for (int i = 0; i < maxGrids; ++i) {
    //    grids[i][0] = mYoloV8netHeight / mStrides[i];
    //    grids[i][1] = mYoloV8NetWidth / mStrides[i];
    //}

    const int maxGrids = mStridesLength;
    int** grids = new int*[maxGrids];
    for (int i = 0; i < maxGrids; ++i) {
        grids[i] = new int[2];
        grids[i][0] = mYoloV8netHeight / mStrides[i];
        grids[i][1] = mYoloV8NetWidth / mStrides[i];
    }

    for (unsigned int i = 0; i < maxGrids; i++) {
        int grid_h = grids[i][0];
        int grid_w = grids[i][1];
        int stride = mStrides[i];
        numElem = grid_h * grid_w * batchSize;
        if (numElem < mThreadCount)
            mThreadCount = numElem;

        CalDetection<<<(numElem + mThreadCount - 1) / mThreadCount, mThreadCount, 0, stream>>>(
                inputs[i], output, numElem, mMaxOutObject, grid_h, grid_w, stride, mClassCount, mNumberofpoints,
                mConfthreshkeypoints, outputElem, is_segmentation_, is_pose_);
    }

    // 释放内存
    for (int i = 0; i < maxGrids; ++i) {
        delete[] grids[i];
    }
    delete[] grids;

manfrey666 avatar May 13 '24 09:05 manfrey666

    int maxGrids = mStridesLength;
    int flatGridsLen = 2 * maxGrids;
    int* flatGrids = new int[flatGridsLen];

    for (int i = 0; i < maxGrids; ++i) {
        flatGrids[2*i] = mYoloV8netHeight / mStrides[i];
        flatGrids[2*i + 1] = mYoloV8NetWidth / mStrides[i];
    }



    for (unsigned int i = 0; i < maxGrids; i++) {
        // Access the elements of the original 2D array from the flattened 1D array
        int grid_h = flatGrids[2*i];     // Corresponds to the access of grids[i][0]
        int grid_w = flatGrids[2*i + 1]; // Corresponds to the access of grids[i][1]
        int stride = mStrides[i];
        numElem = grid_h * grid_w * batchSize; // Calculate the total number of elements
        if (numElem < mThreadCount)            // Adjust the thread count if needed
            mThreadCount = numElem;

        // The CUDA kernel call remains unchanged
        CalDetection<<<(numElem + mThreadCount - 1) / mThreadCount, mThreadCount, 0, stream>>>(
                inputs[i], output, numElem, mMaxOutObject, grid_h, grid_w, stride, mClassCount, mNumberofpoints,
                mConfthreshkeypoints, outputElem, is_segmentation_, is_pose_);
    }

    delete[] flatGrids;
可以这样改,一维数组简化开销,增大效率  

lindsayshuo avatar May 13 '24 09:05 lindsayshuo

好的,感谢

manfrey666 avatar May 13 '24 10:05 manfrey666

是的,已经测试,按照上面的方式

cronousbaby avatar May 13 '24 13:05 cronousbaby

https://github.com/wang-xinyu/tensorrtx/pull/1524,已经提交修复

lindsayshuo avatar May 14 '24 00:05 lindsayshuo

是的,已经测试,按照上面的方式

好的,感谢

https://github.com/wang-xinyu/tensorrtx/pull/1524

lindsayshuo avatar May 14 '24 00:05 lindsayshuo