wang-xinyu / tensorrtx

Implementation of popular deep learning networks with TensorRT network definition API
MIT License
6.72k stars 1.74k forks source link

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

Open cronousbaby opened 1 month ago

cronousbaby commented 1 month ago

在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。

wang-xinyu commented 1 month ago

@lindsayshuo Pls advice.

lindsayshuo commented 1 month ago

在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 commented 1 month ago

在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 commented 1 month ago

在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 版本。

cronousbaby commented 1 month ago

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

manfrey666 commented 1 month ago

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

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

manfrey666 commented 1 month ago

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

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

好像是 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;
lindsayshuo commented 1 month ago
      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;
可以这样改,一维数组简化开销,增大效率  
manfrey666 commented 1 month ago

好的,感谢

cronousbaby commented 1 month ago

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

lindsayshuo commented 1 month ago

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

lindsayshuo commented 1 month ago

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

好的,感谢

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