Linux平台CUDA+OpenCV3.4配置

前段时间,在TX2上装了OpenCV3.4,TX2更新源失败的问题,OpenCV内部很多函数都已经实现了GPU加速,但是我们手动写的函数,想要通过GPU加速就需要手动调用CUDA进行加速。下面介绍Linux平台的环境配置以及与OpenCV混合编译。

Linux平台CUDA+OpenCV3.4配置

1 环境安装

首先需要安装OpenCV及CUDA环境安装,有TX2平台下OpenCV和CUDA参考百度。注意TX2自带了OpenCV2.14,如果需要安装高版本的OpenCV话需要注意多版本管理的问题。安装完成后,可以编译OpenCV例程来判断OpenCV是否安转完成,CUDA安装可以在终端输入

nvcc

如果终端打印下面信息,表示安装完成

2 CUDA编译流程

CUDA的程序通过nvcc编译器编译成可执行文件,CUDA的可执行文件有两种,分别是在Host上执行的CPU相关代码,另一部分是在Device上执行的GPU代码,nvcc编译的指令与gcc/g++编译器差不多,基本指令如下

nvcc --gpu-architecture=compute_62 --gpu-code=compute_62 -I/usr/local/cuda/include/  -c kernels.cu -o kernels.o

其中:

--gpu-architecture和--gpu-code指定了GPU的计算能力,请根据自己GPU的运算能力修改,有关GPU运算能力可以在这里查找(NVIDIA官网挂了,将就着在维基百科里面看吧),--gpu-architecture指定ptx将来可以生成怎么样的版本,--gpu-code指定马上生成的代码版本,--gpu-architecture和--gpu-code可以有多个值,这样nvcc会将多个版本的代码一同放在fatbin文件中,

-I/usr/local/cuda/include/指定了CUDA包含头文件的目录,如果还有其他的头文件,要将这些头文件的路径包含进来(见3)

-c表示只对源文件进行编译,不进行链接,及将.cu文件编译生成.cu文件

-o指定要生成.o文件的文件名

还有其他的一些编译选项可以参考NVIDIA的nvcc编译手册,在CUDA的安装目录下可以找到

3 CUDA与OpenCV混合编译

CUDA与OpenCV的混合编译其实就是讲.cu文件与.c/.cpp文件混合编译,编译的方法比较多,NVIDIA官网有介绍利用cmake进行编译的方法,点这里,网上介绍的比较多的也是利用cmake进行编译,使用Makefile编译的教程比较少,这里介绍一下利用Makefile对CUDA与c++进行混合编译。

其实CUDA与c/c++一起编译原理很简单,CUDA C也只是一个拓展的c语言集,所以我采用的是利用nvcc编译器和g++分别对.cu文件和.cpp文件进行编译,生成.o文件,然后利用g++进行链接,实测方法可行。因为我CUDA的程序全部都在.cu文件中,然后在.cpp文件中通过extern对CUDA的函数申明,像下面这样:

/*main.cpp*/

extern int buildMaps(float *model, float *input, float *output, int height, int width);

int main()
{
    /*初始化代码*/
    ......    

    buildMaps((float *)model, (float *)input, output, width, width);

    /*other*/
    ......
}
/*kernel.cu*/

/*GPU内核函数*/
__global__ void kernel_compute(float *model, float *input, float *output)
{
    ......
}

int buildMaps(float *model, float *input, float *output, int height, int width)
{
     /*init*/
    ......

    kernel_compute <<<grid, block>>> (dev_m, dev_i, dev_o);

    /*other*/
    ......
}

所以这里的OpenCV代码像普通OpenCV代码一样写Makefile就行,写CUDA的代码的Makefile时注意,如果.cu文件中有OpenCV的相关代码的话,需要在nvcc编译的时候添加

-DOPENCV `pkg-config --cflags opencv-3.4`

用来指定OpenCV的包含头文件路径,没有错误的话,编译完成就可以使用g++链接就可以了。

这里贴一下我自己在用的一个Makefile模板,写的比较粗糙,不过平常的编译基本够了,中小型的工程的Makefile都可以用这个模板修改的到,模板有不完善的地方还请大家指正

#cpp源文件路径
SRCS = $(wildcard ./src/*.cpp)

#cu文件路径
CU_SRC = $(wildcard ./src/*.cu)

#.o文件
OBJS = $(patsubst %.cpp,%.o,$(SRCS))
CU_OBJ = $(patsubst %.cu,%.o,$(CU_SRC))

#g++和nvcc编译器
CXX = g++
NVCC = nvcc

#C/C++编译选项  --  OpenCV头文件路径
CFLAGS = `pkg-config --cflags opencv-3.4`

#C/C++编译选项  --  当前工程头文件路径及优化选项(-O3)
CFLAGS += -I./include/ -std=c++11 -O3 

#开启OpenMP
CFLAGS += -fopenmp

#CUDA C编译选项
NVFLAGS = --gpu-architecture=compute_62 --gpu-code=compute_62
NVFLAGS += -DOPENCV `pkg-config --cflags opencv-3.4`

#C/C++链接器选项  -- OpenCV库及其路径
LDFLAGS = `pkg-config --libs opencv-3.4` -O3
LDFLAGS += -fopenmp

#C/C++链接器选项  -- CUDA8.0库及其路径
NVLDFLAGS = `pkg-config --libs cuda-8.0`

#最终目标
EXE = video

#OpenMP选项  --  指定绑定CPU
GOMP_CPU_AFFINITY="0 3 4 5"

#链接
$(EXE) : $(OBJS) $(CU_OBJ)
    @echo Linking ...
    @$(CXX) -o [email protected] $^ $(LDFLAGS) $(NVLDFLAGS)

#C/C++编译
%.o : %.cpp
    @echo Compiling $< ...
    @$(CXX) $(CFLAGS) -c $<
    @-mv *.o src/

#CUDA C编译
%.o : %.cu
    @echo NVCC Compiling $< ...
    @$(NVCC) $(NVFLAGS) -c $<
    @-mv *.o src/

.PHONY:clean

clean :
    -rm src/*.o
    -rm $(EXE)

原文地址:https://www.cnblogs.com/br170525/p/8331640.html

时间: 2025-01-17 15:02:32

Linux平台CUDA+OpenCV3.4配置的相关文章

Linux平台oracle 11g单实例 安装部署配置 快速参考

1.重建主机的Oracle用户 组 统一规范 uid gid 以保证共享存储挂接或其他需求的权限规范 userdel -r oracle groupadd -g 500 oinstall groupadd -g 501 dba useradd -g oinstall -G dba -u 500 oracle #id oracle uid=500(oracle) gid=500(oinstall) 组=500(oinstall),501(dba) 2.安装好Oracle 需要的rpm包.安装rpm

PHP开发环境的配置(Linux平台上安装Apache和PHP)

PHP开发环境的配置(Linux平台上安装Apache和php): 下载Apache (httpd-2.4.12.tar.gz).下载PHP(php-5.6.9.tar.gz).下载与PHP安装相关的libxml2(libxml2-2.7.8.tar.gz).下载与Apache安装相关的三个文件:apr(apr-1.5.2.tar.gz).apr-util(apr-util-1.5.4.tar.gz).pcre (pcre-8.10.zip) (1)安装Apache:在安装apache之前必须先

linux平台下一键配置网站https

部署过SSL证书的人都知道,申请和部署一张SSL证书是相当繁琐而漫长的过程,枯燥无味的部署指南.非常容易出错的命令.复杂的编辑配置等等,在linux平台下,更加痛不欲生.不过,站长们的福音来啦~!LZ今天发现一个叫"SSL精灵"的工具,支持linux平台下自动申请.自动安装和自动续期SSL证书,更神奇的是,这家CA还提供多域名免费SSL证书,通过自动读取配置文件获取站点域名,自动调用WoSign后台服务请求域名验证和申请ssl证书,并自动部署证书.自动安装工具+免费SSL证书,这不是相

tomcat https/ssl 服务配置(带有双向验证,windows,linux平台验证通过)

1. 创建服务器密钥,其密钥库为 /home/gr/server.ks PS1: 注意keypass和storepass保持一致,它们分别代表 密钥密码和密钥库密码, PS2: 注意 CN=localhost 中,localhost表示要配置SSL的主机名,不能任意指定 ~$keytool -genkey -v -alias serverKey -dname "CN=192.168.10.101" -keyalg RSA -keypass 123456 -keystore server

Linux平台 Oracle 18c RAC安装Part2:GI配置

三.GI(Grid Infrastructure)安装 3.1 解压GI的安装包 3.2 安装配置Xmanager软件 3.3 共享存储LUN的赋权 3.4 使用Xmanager图形化界面配置GI 3.5 验证crsctl的状态 3.6 测试集群的FAILED OVER功能 Linux平台 Oracle 18c RAC安装指导: Part1:Linux平台 Oracle 18c RAC安装Part1:准备工作 Part2:Linux平台 Oracle 18c RAC安装Part2:GI配置 Pa

linux平台配置odbc连接dm7达梦数据库

达梦数据库以 RDBMS 为核心,以 SQL 为标准,是一个能跨越多种软硬件平台.具有大型数据综合管理能力的.高效稳定的通用数据库管理系统.(本次实验环境以dm7为例) DM7 提供了多种数据库访问接口,包括 ODBC.JDBC.DPI.OLEDB 以及嵌入方式等. 下面介绍Linux 平台如何配置ODBC 连接DM7 达梦数据库,这里主要讲手工配置DM7 的ODBC 连接. 1.环境说明 系统环境:中标麒麟NeoKylin Advance V6.0 x86_64.iso [[email pro

Linux平台安装配置MySQL数据库

Linux系统版本:CentOS7.4MySQL版本:5.7.28在Linux平台有RPM包.二进制包.源码包3中安装方式,这一篇文件主要是以RPM包为例来介绍如何在Linux平台下进行MySQL的安装.下载地址:https://dev.mysql.com/downloads/mysql/ 安装RPM包的具体操作步骤如下:(1)首先卸载mariadb,不然后面会和安装mysql需要的库冲突: [[email protected] ~]# rpm -qa | grep mariadb mariad

Linux 平台下 YUM 源配置 手册

Redhat/Centos 系的Linux 平台,推荐使用YUM 来安装相关依赖包. 安装方式有两种,一种是使用本地的YUM,一种使用在线的YUM. 1         在线YUM 源 如果操作系统能上网,可以直接使用yum 源. USTC,163的yum源速度都不错. 创建文件:/etc/yum.repos.d/cndba.repo 添加如下内容 #USTC 的YUM 源: [cndba.cn] name=CentOS-$releasever - Base - mirrors.ustc.edu

Windows 和 Linux 平台下的端口转发工具

原文地址: http://unmi.cc/windows-linux-port-forwarding/ 这里记录一下我曾经使用过的几个端口转发工具,即端口映射.端口重定向,和 NAT 也是差不多的概念. Linux 下用过 iptables,rinetd:Windows 下用过某个防火墙的 NAT 功能.RemoteAnywhere 的端口重定向.FPipe,还有最近刚找到的 PassPort.试着去设置一下 Windows 2000 的 NAT  功能,但未成功,还是特定的软件简单易用,下面介