系统信息(版本)
详细说明
我正在使用基于GPU的功能和操作。我自己构建了支持CUDA的OpenCV,大多数GPU功能和操作都运行良好。但是,当涉及过滤相关功能(如createGaussianFilter
或createSobelFilter
时)会触发以下异常:
C:\ OpenCV \ opencv-3.2.0 \ modules \ cudafilters \ src \ filtering.cpp:414:错误:(-215)rowFilter_!= 0在函数`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;
}
答案 0 :(得分:1)
您可以找到here代码来测试Sober过滤器的CUDA版本。
在我看来,这是OpenCV开发人员的选择(CUDA API允许双精度计算,因为我认为这是一段很长的时间)。不接受CV_64F
或双精度浮点,因为效率较低,更好的精度不值得性能下降。计算机图形不需要这么精确,因此GPU架构具有更多单精度单位(更多信息here,2010)。
另见CUDA faq。
注意:游戏GPU与专业GPU尤其如此(参见here,2015):
NVIDIA GPU摘要
NVIDIA的GTX系列因其出色的FP32性能而闻名 FP64性能非常差。性能通常是范围 在1:24(开普勒)和1:32(麦克斯韦尔)之间。例外情况是这样的 GTX Titan卡模糊了消费者GTX之间的界限 系列和专业的特斯拉/ Quadro卡。
开普勒架构Quadro和特斯拉系列卡提供完整版 双精度性能,1:3 FP32。但是,随着Quadro M6000,NVIDIA决定只提供最低限度的FP64性能 只给它1:32的FP32能力并宣传M6000为 最好的显卡而不是像最好的图形+计算卡 Quadro K6000。
AMD GPU
与FP32相比,AMD GPU在FP64上的表现相当不错。大多数AMD卡 (包括消费者/游戏系列)将提供1:3和1:8的FP32 FP64的性能。 AMD Tahiti架构在这些测试中进行了测试 这里的基准测试不会遇到与FP64相同的问题 NVIDIA的GTX系列,性能为1:4。较新的夏威夷 架构消费级GPU预计将提供1:8 性能FirePro W9100,W8100和S9150将为您提供令人难以置信的FP64 1:2 FP32性能。
总的来说,AMD GPU在良好的双精度方面享有盛誉 性能比与NVIDIA同行相比。