- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在运行以下代码:
cv::Ptr<cv::FastFeatureDetector> fastDetector = cv::FastFeatureDetector::create(100, true, 2);
cv::Ptr<cv::cuda::FastFeatureDetector> gpuFastDetector = cv::cuda::FastFeatureDetector::create(100, true, 2);
std::vector<cv::KeyPoint> keypoints;
std::vector<cv::KeyPoint> gpuKeypoints;
cv::Mat frame;
cv::cuda::GpuMat gFrame;
frame = cv::imread("image1.jpg"); // 4608 x 3456
cv::cvtColor(frame, frame, CV_BGR2GRAY);
gFrame.upload(frame);
gpuFastDetector->detect(gFrame, gpuKeypoints);
std::cout << "FAST GPU " << gpuKeypoints.size() << std::endl;
fastDetector->detect(frame, keypoints);
std::cout << "FAST " << keypoints.size() << std::endl;
输出是:
FAST GPU 2210
FAST 3209
问题一
为什么相同的算法应用于具有相同参数的相同图像会导致检测到不同数量的关键点?
问题二
我在 Windows 上的 Visual Studio 中运行它。使用Debug 配置时,GPU 检测执行得更快。
但是当使用 Release 时,普通 (CPU) 快速检测器执行得更快。此外,无论使用何种配置类型,检测器在 GPU 上的性能都保持不变。但是,与 Debug 配置相比,在 Release 下执行检测时,CPU 上的性能会急剧增加。
(我没有对此处提供的代码进行测量。我知道由于上下文初始化,对某些 OpenCV 函数的第一次调用可能需要更长时间才能执行。)
这很可能与我的旧 question about the FAST detector 有关。BHawk 给出了关于 CPU 上 SIMD 优化的合理解释。
那么,第二个问题是:
SIMD 优化的 CPU 是否有可能比 GPU 更快地执行 FAST 特征检测?这似乎不太可能。
最佳答案
初始化冗长的答案:)
问题 1:
调试编译不使用发布版本使用的代码优化。调试版本会做一些事情,比如保留临时变量数据,以便您可以在调试器中读取数据。这通常意味着通常临时存在于 CPU 寄存器中的数据将溢出并在调试版本中被复制到 RAM 中。当在优化的发布版本中不再需要相同的数据时,它们将被丢弃。如果您在编译设置中禁用代码优化,这种差异可能会消失;我不确定我以前从未尝试过在没有优化的情况下进行编译。
问题 2:
在确定图像处理在 GPU 还是 CPU 上表现更好时,有几个因素在起作用。
1:内存管理
GPU 处理的主要瓶颈是将数据加载到 GPU 以及从 GPU 检索数据。对于非常大的图像(在您的情况下为 16 兆像素),此瓶颈可能成为一个重大障碍。当您将图像加载到 GPU 上,然后将图像留在那里以通过 OpenGL 上下文进行操作和显示时(就像您在 3D 游戏引擎中看到的那样),GPU 的工作效果最佳。
2:串行与并行
GPU 由数千个并行运行的小型处理核心组成。因此,他们能够同时执行许多小任务。另一方面,CPU 经过优化以串行执行复杂任务。这意味着某些任务(大图像上下文、复杂计算、多步骤过程)在 CPU 上的性能可能比在 GPU 上更好。另一方面,使用小图像上下文且不需要多个处理步骤的更简单任务在 GPU 上的执行速度要快得多。更复杂的是,CPU 可以线程化以并行运行,具体取决于可用计算核心的数量。最重要的是,SIMD 优化的 CPU 可以进一步并行化处理。所以一个4核CPU和8个SIMD ALU可以同时处理32条数据。这仍然与 GPU 中存在的 1000 个内核相差甚远,但 CPU 内核通常处理速度更快,因此 4 个内核和 8 个 SIMD 在某些任务上可能执行得更快。当然,如果您使用具有更多内核或更多 ALU 的系统,CPU 速度也会缩放,如果您减少数量,CPU 速度也会降低。
结论
由于内存瓶颈,有些图像处理任务不太适合GPU。数据 IO 抵消了大规模并行化带来的任何速度增益。如果您拥有高度优化的并行化 SIMD CPU 算法,由于算法的性质和/或进出 GPU 的数据 IO,CPU 版本肯定有可能比 GPU 执行得更快。您可能还会发现,在处理小图像时,GPU 版本的速度仍然稍快。
我必须通读源代码才能确切了解此特定函数在 CPU 上的运行速度比 GPU 快的方式和原因,但我对此并不感到惊讶。关于为什么一种实现与另一种实现获得不同数量的功能,这也需要通读,但这可能是为了内存分配或优化目的而不同地改变每个实现的功能。
很抱歉回答很长,但这是一个复杂的讨论话题。
关于c++ - GPU 上的 OpenCV FAST 检测器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39920813/
谁能解释或指出在多 GPU/多显示器设置中渲染如何工作的解释(或至少一些线索)? 例如,我安装了 5 个 NVIDIA Quadro 4000 视频卡并连接了 9 个显示器。显示不进行任何分组。刚刚在
以下代码报错: import spacy spacy.require_gpu() Traceback (most recent call last): File "/home/user/Pycha
正如问题已经暗示的那样,我是深度学习的新手。我知道模型的学习过程在没有 GPU 的情况下会很慢。如果我愿意等待,如果我只使用CPU可以吗? 最佳答案 在计算深度学习(以及一般的神经网络)中执行的许多操
我知道 Renderscript 的设计是为了掩盖我正在运行的处理器的事实,但是有没有办法编写代码,以便在支持 GPU 计算的设备(目前是 Nexus 10)上运行显卡?有什么方法可以判断脚本的功能正
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我想以编程方式找出可用的 GPU 及其当前内存使用情况,并根据内存可用性使用其中一个 GPU。我想在 PyTorch 中执行此操作。 我在这个 post 中看到了以下解决方案: import torc
我喜欢 GPU Gems 的结构化技术摘要。但是自上次发布以来已经过去了很长时间,应该开发新算法来处理新型硬件。 我可以阅读有关最近 GPU 技术成就的哪些信息? 潜伏在编程板上是唯一的方法吗? 最佳
我一直在做一些关于测量数据传输延迟的实验 CPU->GPU 和 GPU->CPU。我发现对于特定消息大小,CPU->GPU 数据传输速率几乎是 GPU->CPU 传输速率的两倍。谁能解释我为什么会这样
当我使用选项 --gres=gpu:1 向具有两个 GPU 的节点提交 SLURM 作业时,如何获取为该作业分配的 GPU ID?是否有用于此目的的环境变量?我使用的 GPU 都是 nvidia GP
我用 gpu、cuda 7.0 和 cudnn 6.5 安装了 tensorflow。当我导入 tensorflow 时,它运行良好。 我正在尝试在 Tensorflow 上运行一个简单的矩阵乘法,但
我们正在寻找有关 slurm salloc gpu 分配的一些建议。目前,给定: % salloc -n 4 -c 2 -gres=gpu:1 % srun env | grep CUDA CUD
我是否必须自定义为非 GPU Tensorflow 库编写的代码以适应tensorflow-gpu 库? 我有一个 GPU,想运行仅为非 GPU tensorflow 库编写的 Python 代码。我
我是否必须自定义为非 GPU Tensorflow 库编写的代码以适应tensorflow-gpu 库? 我有一个 GPU,想运行仅为非 GPU tensorflow 库编写的 Python 代码。我
我正在使用 pytorch 框架训练网络。我的电脑里有 K40 GPU。上周,我在同一台计算机上添加了 1080。 在我的第一个实验中,我在两个 GPU 上观察到相同的结果。然后,我在两个 GPU 上
有没有办法在 Slurm 上超额订阅 GPU,即运行共享一个 GPU 的多个作业/作业步骤?我们只找到了超额订阅 CPU 和内存的方法,但没有找到 GPU。 我们希望在同一 GPU 上并行运行多个作业
我可以访问 4 个 GPU(不是 root 用户)。其中一个 GPU(2 号)表现怪异,它们的一些内存被阻塞但功耗和温度非常低(好像没有任何东西在上面运行)。请参阅下图中 nvidia-smi 的详细
我正在尝试通过 Tensorflow 运行示例 seq2seq,但它不会使用 GPU。以下是我在带有 Tesla K20x 的 Linux 系统上安装 Tensorflow 所采取的步骤 git cl
一位电气工程师最近提醒我不要使用 GPU 进行科学计算(例如,在精度非常重要的地方),因为没有像 CPU 那样的硬件保护措施。这是真的吗?如果是的话,典型硬件中的问题有多普遍/严重? 最佳答案 实际上
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
最近我研究了强化学习,有一个问题困扰着我,我找不到答案:如何使用 GPU 有效地完成训练?据我所知,需要与环境持续交互,这对我来说似乎是一个巨大的瓶颈,因为这项任务通常是非数学的/不可并行化的。然而,
我是一名优秀的程序员,十分优秀!