无法在OpenCV GPU(CUDA)中创建过滤器

beq87vna  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(165)

系统信息(版本)

  • OpenCV =〉3.2
  • 操作系统/平台=〉Windows 10 64位
  • 编译器=〉Visual Studio 2015社区
  • CUDA工具包版本=〉8.0
    详细说明

我正在使用基于GPU的函数和操作。我自己构建了支持CUDA的OpenCV,大多数GPU函数和操作都运行良好。但当涉及到过滤器相关函数(如createGaussianFiltercreateSobelFilter)时,会捕获以下异常:
C:\OpenCV\opencv-3.2.0\modules\cudafilters\src\filtering.cpp:414: error: (-215) rowFilter_ != 0 in functionanonymous-namespace'::SeparableLinearFilter::SeparableLinearFilter`

要复制的代码

// C++ code example
// A very simple snnipet
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudafilters.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    try
    {
        Ptr<cuda::Filter> filterX = cuda::createSobelFilter(CV_64F, CV_64F, 1, 0, 3, 1, BORDER_DEFAULT); // x direction
    }
    catch (cv::Exception& e)
    {
        const char* err_msg = e.what();
        std::cout << "exception caught: " << err_msg << std::endl;
    }

    return 0;
}
vwhgwdsa

vwhgwdsa1#

您可以在这里找到测试CUDA版本的清醒过滤器的代码。
在我看来,这是OpenCV开发人员的选择(CUDA API允许双精度计算,因为我认为时间很长)。CV_64F或双精度浮点不被接受,因为效率较低,更好的精度不值得性能下降。计算机图形不需要这样的精度,因此GPU架构有更多的单精度单元(更多信息here,2010年)。
另请参见CUDA faq
注意:游戏GPU与专业GPU的对比尤其如此(参见here,2015):
NVIDIA GPU概述
NVIDIA的GTX系列以其出色的FP 32性能而闻名,但其FP 64性能却非常差。性能通常在1:24(Kepler)和1:32(麦克斯韦)之间。GTX Titan显卡是个例外,它模糊了消费级GTX系列和专业级Tesla/Quadro显卡之间的界限。
Kepler架构的Quadro和Tesla系列显卡采用1:3 FP 32,可提供完全的双精度性能。但是,NVIDIA决定仅为Quadro M6000提供最低限度的FP 64性能,仅为其提供1:32的FP 32性能,并将M6000吹捧为最佳显卡,而不是像Quadro K6000那样的最佳图形+计算卡。
AMD图形处理器
与FP 32相比,AMD GPU在FP 64上的性能相当不错。大多数AMD显卡(包括消费/游戏系列)在FP 64上的FP 32性能给予1:3到1:8之间。在这些基准测试中测试的AMD大溪地架构没有遇到与NVIDIA GTX系列相同的FP 64问题,性能为1:4。较新的夏威夷架构消费级GPU预计将提供1:8的性能。
FirePro W 9100、W8100和S9150将为您带来令人难以置信的FP 64 1:2 FP 32性能。
总体而言,AMD GPU拥有良好的双精度性能比的声誉相比,他们的NVIDIA同行。

相关问题