前言

GDAL库中提供的gdalwarp支持各种高性能的图像重采样算法,图像重采样算法广泛应用于图像校正,重投影,裁切,镶嵌等算法中,而且对于这些算法来说,计算坐标变换的运算量是相当少的,绝大部分运算量都在图像的重采样算法中,尤其是三次卷积采样以及更高级的重采样算法来说,运算量会成倍的增加,所以提升这些算法的处理效率优先是提高重采样的效率。由于GPU的多核心使得目前对于GPU的并行处理非常热,同时也能大幅度的提升处理速度。基于上述原因,GDALWARP也提供了基于OPENCL的GPU加速,之前在GDAL的邮件列表中有人测试发现使用OpenCL加速后,在Telsa的显卡上速度可以达到CPU的20~60倍。

GDAL库一般编译的时候不会打开,所以默认的GDAL是不支持GPU并行处理的,本文就是指导大家在Windows平台上使用Visual Studio系列编译GDAL时,怎么使之支持OpenCL并行处理。

所需软件

-Visual Studio 系列(VS2003以上版本)

-OpenCL库(AMD或者NVIDIA均可)

-GDAL源码


修改nmake.opt文件

nmake.opt文件中一共要修改四处地方,其中两处是添加,两处是修改。

第一处(增加)

首先在nmake.opt文件参考其他的引用库,添加OpenCL的库目录。首先在namke.opt找到下面这行:

########### END OF STUFF THAT NORMALLY NEEDS TO BE UPDATED ##################

在上面这行代码的前面添加如下代码(使用的是NVIDIA的CUDA安装包下面的OpenCL库):

#include opencl lib
INCLUDE_OPENCL = YES # Uncomment for OPENCL_AMD support
!IFDEF INCLUDE_OPENCL
OPENCL_DIR="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0"
OPENCL_CFLAGS = -I$(OPENCL_DIR)/include -DHAVE_OPENCL
OPENCL_LIB = $(OPENCL_DIR)/lib/Win32/OpenCL.lib
!ELSE
OPENCL_DIR=
OPENCL_CFLAGS = -I
OPENCL_LIB =
!ENDIF

第二处(增加)

然后在上面那行代码(END OF STUFF THAT NORMALLY NEEDS TO BE UPDATED)的下面添加下面的代码:

# liml
!IFDEF INCLUDE_OPENCL
OPENCL_FLAG = -DHAVE_OPENCL
!ENDIF

第三处(修改)

接下来找到代码CFLAGS = 这句代码,在这句代码的后面加上$(OPENCL_FLAG)

地四处(修改)

找到代码EXTERNAL_LIBS =,在最后面加上$(OPENCL_LIB)

修改alg目录下的makefile.vc文件

makefile.vc文件中共需要修改两处位置,一处增加一处修改。

第一处(增加)

在文件中OBJ = 的前面添加下面的代码,用来设置使用OpenCL的宏定义。

!IFDEF INCLUDE_OPENCL
EXTRAFLAGS = $(EXTRAFLAGS) $(OPENCL_CFLAGS) -DHAVE_OPENCL
!ENDIF

第二处(修改)

在文件中OBJ = 的后面添加OpenCL的算法文件gdalwarpkernel_opencl.obj。注意添加的时候与其他的obj文件中间用空格隔开。

编译

修改完上述文件之后,使用VS或者命令行编译,正常的话应该就直接编译通过了。如果编译不过提示.h文件无法打开啥的,请检查opencl的库的路径设置的是否有问题,如果opencl的路径中有空格的话,那么在nmake.opt文件中,路径用双引号括起来,如果最后提示连接错误,或者lib文件找不到,同样先检查opencl的库路径设置的是否正确,如果路径中有空格,同样用双引号括起来。

注意

如果你还是编译不过去,根据提示内容,修改gdalwarpkernel_opencl.h和文件gdalwarpkernel_opencl.c文件。我就遇到了这个问题,修改的是h文件,修改前后的代码如下(上方的是原来的代码,下方是修改后的代码):

#if defined(DEBUG_OPENCL) && DEBUG_OPENCL == 1
#define CL_USE_DEPRECATED_OPENCL_1_0_APIS
#endif

#if defined(DEBUG_OPENCL) && DEBUG_OPENCL == 1
#define CL_USE_DEPRECATED_OPENCL_1_0_APIS
#else
#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
#endif

至此,编译如果没有问题的话,那么就可以使用depends之类的查看dll的依赖关系的软件来查看gdal的动态库,如果gdal的动态库依赖opencl.dll的话,那么应该就可以支持了,可以使用gdal自带的gdalwarp.exe进行测试是否支持opencl。

注意:GDAL库中的重采样算法支持opencl库的有双线性插值和三次立方卷积,最邻近采样是不支持OpenCL加速的,所以测试的时候请指定重采样算法进行测试。

两个问题

使用GDAL的GPU测试的时候发现下面两个问题:

1、使用OPENCL进行重采样时,只能使用第一个设备进行处理(比如我的笔记本可以获取到两个GPU设备,第一个是Intel的集成显卡,第二个才是Nvidia的独立显卡)

2、使用-wm参数设置大于显卡显存时,处理失败

第一个问题,我大致修改了下,参考下面的代码,第二个暂时没有。

对于第一个问题的修改,主要就是将默认使用的第一个设置,换成了使用最后一个设备,等有空了可以设置由用户指定使用那个设备进行处理。

修改前的代码:

    // Find the GPU CL device, this is what we really want
// If there is no GPU device is CL capable, fall back to CPU
err = clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_GPU, 1, &device, NULL);
if (err != CL_SUCCESS)
{
// Find the CPU CL device, as a fallback
err = clGetDeviceIDs(platforms[0], CL_DEVICE_TYPE_CPU, 1, &device, NULL);
if( err != CL_SUCCESS || device == 0 )
return NULL;
}

修改后的代码

    // Find the GPU CL device, this is what we really want
// If there is no GPU device is CL capable, fall back to CPU
err = clGetDeviceIDs(platforms[num_platforms-1], CL_DEVICE_TYPE_GPU, 1, &device, NULL);
if (err != CL_SUCCESS)
{
// Find the CPU CL device, as a fallback
err = clGetDeviceIDs(platforms[num_platforms-1], CL_DEVICE_TYPE_CPU, 1, &device, NULL);
if( err != CL_SUCCESS || device == 0 )
return NULL;
}

编译GDAL支持OpenCL使用GPU加速的更多相关文章

  1. 编译GDAL支持ArcObjects

    编译GDAL支持ArcObjects. 首先修改nmake.opt文件中对应的ArcObjects,修改后的如下所示: #uncomment to use ArcObjects ARCOBJECTS_ ...

  2. 编译GDAL支持MySQL

    GDAL支持MySQL需要MySQL的库才可以,编译很简单,修改nmake.opt文件中对应的MySQL的库的路径和lib即可. nmake.opt文件中397行左右,如下: # MySQL Libr ...

  3. Windows 10下安装配置Caffe并支持GPU加速(修改版)

    基本环境 建议严格按照版本来 - Windows 10 - Visual Studio 2013 - Matlab R2016b - Anaconda - CUDA 8.0.44 - cuDNN v4 ...

  4. 56 Marvin: 一个支持GPU加速、且不依赖其他库(除cuda和cudnn)的轻量化多维深度学习(deep learning)框架介绍

    0 引言 Marvin是普林斯顿视觉实验室(PrincetonVision)于2015年提出的轻量化GPU加速的多维深度学习网络框架.该框架采用纯c/c++编写,除了cuda和cudnn以外,不依赖其 ...

  5. 项目实战:流水线图像显示控件(列刷新、1ms一次、缩放、拽拖、拽拖预览、性能优化、支持OpenGL GPU加速)

      需求   流水线图像扫描采集控件(带模拟数据测试)性能需求  1.需至少满足可1ms接收一次列数据,而不丢包(接收后可不必立马显示)  2.图片刷新率可达30HZ:限制需求  1.图片高度最小只能 ...

  6. 安卓平台下ARM Mali OpenCL编程-GPU信息检测(转)

    对于ARM Mali GPU,目前是支持OpenCL1.1,所以我们可以利用OpenCL来加速我们的计算. 一直以来,对于Mali GPU的OpenCL编程,一直没有环境来测试.好不容易弄到一个华为M ...

  7. 记录一次Python下Tensorflow安装过程,1.7带GPU加速版本

    最近由于论文需要,急需搭建Tensorflow环境,16年底当时Tensorflow版本号还没有过1,我曾按照手册搭建过CPU版本.目前,1.7算是比较新的版本了(也可以从源码编译1.8版本的Tens ...

  8. windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速

    原文地址:http://www.jianshu.com/p/c245d46d43f0 写在前面的话 2016年11月29日,Google Brain 工程师团队宣布在 TensorFlow 0.12 ...

  9. tensor搭建--windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速

    windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速 原文见于:http://www.jianshu.com/p/c245d46d43f0 ...

随机推荐

  1. [SDOI 2011]染色

    Description 题库链接 给定一棵有 \(n\) 个节点的无根树和 \(m\) 个操作,操作有 \(2\) 类: 将节点 \(a\) 到节点 \(b\) 路径上所有点都染成颜色 \(c\) : ...

  2. [POJ 2104]K-th Number【模板】(主席树)

    题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  3. C++Primer学习——各种运算符

    前缀递增和后缀递增 class NewInt { public: NewInt():RootInt(0){}; NewInt(int IniInt):RootInt(IniInt){}; NewInt ...

  4. k-d tree模板练习

    1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...

  5. 【NOIP2013】传染病控制

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  6. [bzoj4151][AMPPZ2014]The Cave

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一棵有n个节点的树,相邻两点之间的距离为1. 请找到一个点x,使其满足所有m条限制,其中第i条限制为dist(x,a[i])+dist(x ...

  7. 在 Mac OS X 上安装 TensorFlow

    在 Mac OS X 上安装 TensorFlow 这个文档说明了如何在 Mac OS X 上安装 TensorFlow. 注意:从 1.2 版本开始,在 Mac OS X 上 TensorFlow ...

  8. Javascript面向对象编程(一):封装

    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...

  9. Linux中Mysql root用户看不到mysql库问题解决方式

    第一种方式: 1.首先停止MySQL服务:service mysqld stop2.加参数启动mysql:/usr/bin/mysqld_safe --skip-grant-tables &  ...

  10. [ SSH框架 ] Hibernate框架学习之二

    一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...