Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CentOS7下OpenCV2+CUDA9的编译问题解决

CentOS7下OpenCV2+CUDA9的编译问题解决

原创
作者头像
netkiddy
修改于 2018-12-03 13:57:35
修改于 2018-12-03 13:57:35
3.3K00
代码可运行
举报
文章被收录于专栏:非典型程序猿非典型程序猿
运行总次数:0
代码可运行

导言

OpenCV是一个基于(开源)发行的跨平台计算机视觉库。CUDA是由NVIDIA所推出的一种集成技术,透过这个技术,用户可利用NVIDIA的GeForce 8以后的GPU和较新的QuadroGPU进行计算。本文将不涉及OpenCV或者CUDA的更多介绍和使用,主要是提供了对特定版本编译时遇到问题的解决方案。

背景

日前一个项目中的算法部分,一直是依赖于OpenCV2和CUDA8,在项目测试阶段也是完美通过。可在正式上线的时候却在编译OpenCV就一直出错,查到最后才发现生产机器的CUDA版本被人给「偷偷」升级到了CUDA9,也是因此踏上了一条填坑路,记录于下,以被自己所需和他人使用。

如果你是一台全新的环境,当然是按照需要的环境来安装,比如旧版本的OpenCV2 + CUDA8,或者是最新版本的OpenCV4+CUDA10这样的搭配,那么也就不需要再继续阅读下面的内容,因为理论上不会遇到下面的问题。

但是,如果你是在一台已有的环境,且被安装了CUDA9,同时你的代码又依赖于OpenCV2,那么你一定遇到了同样的问题,通过阅读这边文章,你就可以完美的编译并运行你的代码了。

问题

在CUDA9下,我们编译OpenCV2的时候,会遇到了不少报错,主要原因是而相对于CUDA8,在CUDA9中的修改主要是2点:

nppi命名规范

在CUDA9里面,NVIDIA把 libnppi.so换成libnppc.so libnppial.so libnppicc.so libnppicom.so libnppidei.so libnppif.so libnppig.so libnppim.so libnppist.so libnppisu.so libnppitc.so libnpps.so

架构支持

CUDA9.x+里面不支持compute_20 (Fermi)

操作

OpenCV编译

替换cmake

我们在编译OpenCV2时遇到了报错,提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nvcc fatal : Unsupported gpu architecture 'compute_20'

这时候,在OpenCV2解压后的{OPENCV_CODE_PATH}/cmake/目录下找到这两个文件:

  • FindCUDA.cmake
  • OpenCVDetectCUDA.cmake

并使用下文中的直接完整替代(可先备份旧文件)

opencv2.4 with CUDA9 patch

上文中,主要是修复了针对问题1和2的修复(如果希望了解具体的替换内容,可参考此链接)。

未知arch时的二次修改

需要注意的是,当我们根据上文进行更改之后,在cmake时需要通过-DCUDA_GENERATION=xxx来指定CUDA的generation信息(如"Fermi" "Kepler" "Maxwell" "Pascal" "Volta")。如果不指定的话,在cmake时OpenCVDetectCUDA.cmake会基于上述所有已知架构完整编译,也是因此,会尝试编译Fermi架构并出现同样的Unsupported gpu architecture错误。

所以,如果我们未知上述的CUDA GENERATION信息的话,需要对OpenCVDetectCUDA.cmake文件再做两处修改,去除关于compute_20 arch的编译信息,因为如上文所说:CUDA9中不再支持2.0框架:

1. 删除Fermi架构的编译分支选项,将下文:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_arch_bin "2.0")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7") 
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_arch_bin "5.0 5.2")

替换为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_arch_bin "5.0 5.2")

2. 针对CUDA版本9(大于cmake中的6.5),删除2.x的arch信息,将:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(${CUDA_VERSION} VERSION_LESS "5.0")
        set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0")
      elseif(${CUDA_VERSION} VERSION_GREATER "6.5")
        set(__cuda_arch_bin "2.0 2.1(2.0) 3.0 3.5")
      else()
        set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0 3.5")
      endif()

替换为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(${CUDA_VERSION} VERSION_LESS "5.0")
        set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0")
      elseif(${CUDA_VERSION} VERSION_GREATER "6.5")
        set(__cuda_arch_bin "3.0 3.5")
      else()
        set(__cuda_arch_bin "1.1 1.2 1.3 2.0 2.1(2.0) 3.0 3.5")
      endif()

头文件包含

最后一步,根据 CUDA 9.0 manual所说:

Unsupported Features General CUDA ‣ CUDA library. The built-in functions __float2half_rn() and __half2float() have been removed. Use equivalent functionality in the updated fp16 header file from the CUDA toolkit.

因此我们需要在OpenCV中common.hpp里单独添加该头文件(在{OPENCV_CODE_PATH}目录下通过find命令找到该文件)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <cuda_fp16.h>

这时候,我们再次创建编译子目录{OPENCV_CODE_PATH}/mybuild/,并重新进行一次完整的opencv编译操作(在cmake时不必再指定-DCUDA_GENERATION参数了),就可以完美通过了。

链接问题

经过上述的操作,OpenCV的编译环节应该没有任何问题了。然而,在编译我们自己项目代码的时候,依然会遇到链接报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/bin/ld: cannot find -lopencv_dep_nppial
/usr/bin/ld: cannot find -lopencv_dep_nppicc
/usr/bin/ld: cannot find -lopencv_dep_nppicom
/usr/bin/ld: cannot find -lopencv_dep_nppidei
/usr/bin/ld: cannot find -lopencv_dep_nppif
/usr/bin/ld: cannot find -lopencv_dep_nppig
/usr/bin/ld: cannot find -lopencv_dep_nppim
/usr/bin/ld: cannot find -lopencv_dep_nppist
/usr/bin/ld: cannot find -lopencv_dep_nppisu
/usr/bin/ld: cannot find -lopencv_dep_nppitc
collect2: error: ld returned 1 exit status

这是因为,如我们上文所说,在CUDA9中更改了nppi的命名规范,这时候,我们需要去CUDA9的lib下找到对应的so文件,并建立正确的软链接。在我的机器上,CUDA9的lib库路径为/usr/local/cuda-9.0/lib64/,遇到同样问题的朋友,可以找到自己机器伤的PATH并替换下面的命令,再执行软连接操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ln -s {CUDA9_LIB_PATH}/libnppial.so /usr/local/lib/libopencv_dep_nppial.so
 ln -s {CUDA9_LIB_PATH}/libnppicc.so /usr/local/lib/libopencv_dep_nppicc.so
 ln -s {CUDA9_LIB_PATH}/libnppicom.so /usr/local/lib/libopencv_dep_nppicom.so
 ln -s {CUDA9_LIB_PATH}/libnppidei.so /usr/local/lib/libopencv_dep_nppidei.so
 ln -s {CUDA9_LIB_PATH}/libnppif.so /usr/local/lib/libopencv_dep_nppif.so
 ln -s {CUDA9_LIB_PATH}/libnppig.so /usr/local/lib/libopencv_dep_nppig.so
 ln -s {CUDA9_LIB_PATH}/libnppim.so /usr/local/lib/libopencv_dep_nppim.so
 ln -s {CUDA9_LIB_PATH}/libnppist.so /usr/local/lib/libopencv_dep_nppist.so
 ln -s {CUDA9_LIB_PATH}/libnppisu.so /usr/local/lib/libopencv_dep_nppisu.so
 ln -s {CUDA9_LIB_PATH}/libnppitc.so /usr/local/lib/libopencv_dep_nppitc.so

通过上述操作,再重新编译我们的代码,这次就全部没有问题了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
编程语言进化史《禅与计算机程序设计艺术》 / 陈光剑
计算机编程语言是程序设计的最重要的工具,它是指计算机能够接受和处理的、具有一定语法规则的语言。
一个会写诗的程序员
2021/04/30
1.8K0
编程语言进化史《禅与计算机程序设计艺术》 / 陈光剑
这个播放量200万的视频燃爆了!它讲透了:希尔伯特计划是如何被哥德尔与图灵“打脸”的?
1930年,临近退休前,著名数学家大卫·希尔伯特在于柯尼斯堡召开的全德自然科学及医学联合会代表大会上做了题为《自然认知及逻辑》的4分钟演讲。这场即将计入历史的演讲以希尔伯特的6字箴言结束:
AI科技评论
2021/07/02
9950
从算盘到云计算:计算机发展的壮丽历程
在计算机发展史上,早期的计算器起到了重要的作用。而其中最早的计算器便是算盘。算盘是古代中国人使用的一种计算工具,它由一根木棍和一些珠子组成。通过将珠子在木棍上移动,人们可以进行简单的加减乘除运算。虽然算盘的计算速度较慢,但它的使用简单易懂,成为了古代计算的主要工具。
努力的小雨
2023/11/30
6700
世界算力简史(上)
1946年2月14日,在美国宾夕法尼亚州东南部的费城,人们正在像以往一样正常工作和生活。
鲜枣课堂
2023/08/21
3700
世界算力简史(上)
从图灵机到量子计算机,计算机可以解决所有问题吗?
今天,我们正式开启一个新专栏 —— 计算机组成原理。计算机组成原理是计算机科学中最基础的理论知识,你越早掌握这些知识,你就能越早享受知识带来的 "复利效应"。
用户9995743
2022/12/22
1.1K0
从图灵机到量子计算机,计算机可以解决所有问题吗?
计算机发展史
大家好,今天我们要聊的不是魔法,也不是外星科技,而是你每天都在用的——计算机。它是你打游戏、刷社交媒体,甚至在你老婆叫你修电脑时充当“拯救者”的神奇工具。你可能觉得计算机就是个“黑盒子”,但实际上,它的历史是一部“计算机界的励志大片”,从零开始,打破常规,最终蜕变成了你口袋里的高科技小伙伴。好啦,准备好了吗?让我们穿越时空,看看这个“电子怪兽”是怎么一步步成长的。
找Bug
2025/01/19
1180
计算机发展史
1.计算机发展阶段 计算机发展历史 机械式计算机 机电式计算机 电子计算机 逻辑电路与计算机 二极管 电子管 晶体管 硅 门电路 计算机 电磁学计算机二进制
再后来有了一些数学理论的发展,纳皮尔棒/计算尺则是借助了一定的数学理论,可以理解为是一种查表计算法.
noteless
2018/09/11
2.5K0
1.计算机发展阶段  计算机发展历史      机械式计算机 机电式计算机 电子计算机 逻辑电路与计算机  二极管 电子管 晶体管  硅 门电路 计算机 电磁学计算机二进制
计算机科学概论复习笔记(1)
前面的分层都属于内部层,重点在于使计算机系统运转,而应用层的重点则是用计算机解决真实世界的问题。
灯珑LoGin
2022/10/31
5140
计算机科学概论复习笔记(1)
从图灵机、图灵测试到人工智能:什么决定了AI能否取代人类?
导读:美国电视剧《西部世界》第二季的第一集一经播出就引起热议。一时间,人和人工智能这个话题又重新被辩论。由于程序功能越来越强大,人们开始担心:“人工智能程序会不会全面取代人类?”
IT阅读排行榜
2019/08/28
9890
从图灵机、图灵测试到人工智能:什么决定了AI能否取代人类?
程序 = 数据结构 + 算法《禅与计算机程序设计艺术》 / 陈光剑
在计算机程序设计的世界里,先有基本数据类型,复合组装成复杂对象类型,不同对象之间再进行交互操作,进而形成丰富多彩的虚拟世界。
一个会写诗的程序员
2021/04/20
8160
程序 = 数据结构 + 算法《禅与计算机程序设计艺术》 / 陈光剑
12位古代数学家的现代化成就
转自|哆嗒数学网(DuodaaMath) 数学已经成为人类步入现代化的核心工具与中心思想。大到卫星上天,小到一个app应用,都离不开数学——只是你是否知道而已。 但是,请和我们哆嗒数学网的小编一起想象一下。远在数学还没有给我们带来计算机、量子力学和卫星定位系统之前的古代,一些最聪明的大脑已经在不断的发现他们的数学成就。这些发现建立了最基本的数学思想和工具,带领我们走进了现代化的生活。这是多么神奇的事情。 下面列出的12位数学家,就是这些人中的佼佼者。他们的发现,形成了世界走入现代化的数学基石,也是我们步入
大数据文摘
2018/05/24
9970
你知道吗?计算机界也有诺贝尔奖!
这几天2019年诺贝尔奖陆续颁布,诺贝尔奖最初分设物理、化学、生理学或医学、文学、和平等五个奖项,于1901年首次颁发。1968年,瑞典国家银行增加设立了诺贝尔经济学奖。但是一直就是没有诺贝尔计算机奖。其实是有的,计算机界诺贝尔奖——图灵奖。
逆锋起笔
2020/03/05
1.1K0
你知道吗?计算机界也有诺贝尔奖!
【欧拉猜想】是否有无穷多个不可约分的正整数解
这类问题被称为 :欧拉猜想, 其中4和5的都有正整数解, 3的被证明了无整数解,其它的都还不知道。
一个会写诗的程序员
2018/08/17
1K0
【欧拉猜想】是否有无穷多个不可约分的正整数解
计算机发展简史:从机械到半导体
有人说,100年当然很长啊,100年是大约36500天,是876000小时,能够看见世纪的长河,见证时代的发展,翻阅古今史诗。
JanYork_简昀
2024/09/05
2040
计算机发展简史:从机械到半导体
迟到的认可:计算机科学之父图灵将登50英镑新钞
英格兰银行发布官方公告,计算机科学之父阿兰·图灵(Alan Turing)将取代 Matthew Boulton 和 James Watt(蒸汽机先驱),登上将于 2021 年底发行的 50 英镑新钞。英国前首相温斯顿·丘吉尔、作家简·奥斯汀和艺术家约瑟夫·玛罗德·威廉·特纳(JMW Turner)将分别登上 5、10、20 英镑新钞。
机器之心
2019/07/19
3940
迟到的认可:计算机科学之父图灵将登50英镑新钞
0.1 和 0.10 一样吗?
作为公认的劳模,小编每天除了工作,还要从小培养表妹的科研能力和精神。 今天,小编如往常一样监督8岁表妹做作业,在一道0.1等不等于0.10的题目里,表妹毫不犹豫地写上了等号。
magic2728
2019/09/27
1.3K0
0.1 和 0.10 一样吗?
敲开图灵之门:CS 大四学生长文畅谈量子计算机的「前世、今生、未来」
零和 1;零零碎碎;阴与阳。最重要的开关,有的开,有的关。我们都已经习惯了使用现代计算机。每年,像英特尔、AMD、ARM 以及英伟达这样的行业巨头都会发布各自的下一代顶级硅芯片,彼此之间竞争角逐,不断挑战传统计算机的极限。
磐创AI
2021/02/23
3650
敲开图灵之门:CS 大四学生长文畅谈量子计算机的「前世、今生、未来」
哥德尔90年前的「不完备性定理」,奠定了计算机与AI的理论基础
机器之心报道 编辑:蛋酱、小舟 大神早已远去,而他的光芒仍在人间。 1931 年,奥地利裔美国著名数学家库尔特 · 哥德尔(Kurt Gödel)在一篇论文《Über formal unentscheidbare Sätze der Principia Mathematica und verwandter Systeme》中正式发表了不完备性定理。 这一理论使数学基础研究发生了划时代的变化,更是现代逻辑史上的重要里程碑。该定理与塔尔斯基的形式语言和真理论,图灵机和判定问题,一同被赞誉为现代逻辑科学在哲学方
机器之心
2023/03/29
5860
哥德尔90年前的「不完备性定理」,奠定了计算机与AI的理论基础
图灵 V.S 冯诺依曼
图灵和冯诺依曼都对计算机的发展做出了杰出的贡献,那么这两位大神级的人物,谁更配得上计算机之父呢?
程序猿石头
2021/09/02
2K0
图灵 V.S 冯诺依曼
计算机发展历史
电脑的学名叫计算机,电脑是用来做计算的。在古时候,人们最早使用的计算工具可能是手指,英文单词“digit”既有“数字”的意思,又有“手指“的意思。古人用石头打猎,所以还有可能是石头来辅助计算。 缺点:手指和石头太低效了
全栈程序员站长
2022/11/02
8440
计算机发展历史
推荐阅读
相关推荐
编程语言进化史《禅与计算机程序设计艺术》 / 陈光剑
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验