编译GDAL支持OpenCL使用GPU加速
前言
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加速的更多相关文章
- 编译GDAL支持ArcObjects
编译GDAL支持ArcObjects. 首先修改nmake.opt文件中对应的ArcObjects,修改后的如下所示: #uncomment to use ArcObjects ARCOBJECTS_ ...
- 编译GDAL支持MySQL
GDAL支持MySQL需要MySQL的库才可以,编译很简单,修改nmake.opt文件中对应的MySQL的库的路径和lib即可. nmake.opt文件中397行左右,如下: # MySQL Libr ...
- Windows 10下安装配置Caffe并支持GPU加速(修改版)
基本环境 建议严格按照版本来 - Windows 10 - Visual Studio 2013 - Matlab R2016b - Anaconda - CUDA 8.0.44 - cuDNN v4 ...
- 56 Marvin: 一个支持GPU加速、且不依赖其他库(除cuda和cudnn)的轻量化多维深度学习(deep learning)框架介绍
0 引言 Marvin是普林斯顿视觉实验室(PrincetonVision)于2015年提出的轻量化GPU加速的多维深度学习网络框架.该框架采用纯c/c++编写,除了cuda和cudnn以外,不依赖其 ...
- 项目实战:流水线图像显示控件(列刷新、1ms一次、缩放、拽拖、拽拖预览、性能优化、支持OpenGL GPU加速)
需求 流水线图像扫描采集控件(带模拟数据测试)性能需求 1.需至少满足可1ms接收一次列数据,而不丢包(接收后可不必立马显示) 2.图片刷新率可达30HZ:限制需求 1.图片高度最小只能 ...
- 安卓平台下ARM Mali OpenCL编程-GPU信息检测(转)
对于ARM Mali GPU,目前是支持OpenCL1.1,所以我们可以利用OpenCL来加速我们的计算. 一直以来,对于Mali GPU的OpenCL编程,一直没有环境来测试.好不容易弄到一个华为M ...
- 记录一次Python下Tensorflow安装过程,1.7带GPU加速版本
最近由于论文需要,急需搭建Tensorflow环境,16年底当时Tensorflow版本号还没有过1,我曾按照手册搭建过CPU版本.目前,1.7算是比较新的版本了(也可以从源码编译1.8版本的Tens ...
- windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速
原文地址:http://www.jianshu.com/p/c245d46d43f0 写在前面的话 2016年11月29日,Google Brain 工程师团队宣布在 TensorFlow 0.12 ...
- 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 ...
随机推荐
- [JLOI 2012]树
Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深 ...
- 计蒜客NOIP2017提高组模拟赛(三)day2-小区划分
传送门 dp,注意边界 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cst ...
- Codeforces Round #407 (Div. 1)
人傻不会B 写了C正解结果因为数组开小最后RE了 疯狂掉分 AC:A Rank:392 Rating: 2191-92->2099 A. Functions again 题目大意:给定一个长度为 ...
- ●BZOJ 2209 [Jsoi2011]括号序列
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2209 题解: Splay 很好的题,但是把智障的我给恶心到了... 首先不难发现,最后没 ...
- 提高Mysql查询速度的一些建议(转).
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Java 实现32位MD5加密
MD5介绍[链接] Java代码实现 public class Md5Util { private String Md5Util(String s) { try { MessageDigest md ...
- PAT甲级真题打卡:1001.A+B Format
题目: Calculate a + b and output the sum in standard format -- that is, the digits must be separated i ...
- 在java中String类为什么要设计成final
在java中String类为什么要设计成final? - 胖胖的回答 - 知乎 https://www.zhihu.com/question/31345592/answer/114126087
- QRCode.js:使用 JavaScript 生成二维码
什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 JavaScript 库.主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库. 基本用法 ...
- 读书笔记-《Maven实战》-2018/4/18
第五章:坐标和依赖 1.每个依赖中可以包含的元素有: groupId,artifactId,version: 这三个元素是Maven项目最重要的元素.Maven需要根据这三个坐标找到需要的依赖. ty ...