系统信息(版本)
- OpenCV =〉3.2
- 操作系统/平台=〉Windows 10 64位
- 编译器=〉Visual Studio 2015社区
- CUDA工具包版本=〉8.0
详细说明
我正在使用基于GPU的函数和操作。我自己构建了支持CUDA的OpenCV,大多数GPU函数和操作都运行良好。但当涉及到过滤器相关函数(如createGaussianFilter
或createSobelFilter
)时,会捕获以下异常:C:\OpenCV\opencv-3.2.0\modules\cudafilters\src\filtering.cpp:414: error: (-215) rowFilter_ != 0 in function
anonymous-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;
}
1条答案
按热度按时间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同行。