GDAL可以借助OpenCL,对特定重采样方法(只记得最邻近不行,三次卷积可以,双线性忘了),使用GPU提升计算效率
需要
- GDAL源码
- OpenCL
- Visual Studio
- SQLite(可选)
- PROJ(可选)
1、查看自己电脑的显卡配置支不支持OpenCL
方法很多,可以自行百度。我是下载TechPowerUp GPU-Z(点击链接进入下载页)查看OpenCL项目前有没打勾
2、安装OpenCL
可以使用Intel,Nvidia官网都能下,也能用CUDA里带的。我用的Intel家的Intel® SDK for OpenCL,选择符合你本地系统的SDK下载(需要自行注册账号),安装。
安装过程没啥需要注意的,一路next,凭感觉勾选一些选项,最后会安装一个system studio到目标路径下,最关键的OpenCL SDK就在里边
3、下载GDAL源码
官网下载地址,看你的网络情况,可能需要挂梯子。这里可以选择3.X版本的或者2.X版本的,区别在于2.X版本不需要SQLite和PROJ依赖,如果选择3.X版本还需要额外安装这俩东西,安装方法见这个文章的相关内容。
注意! proj如果使用 OSGeo4W安装,不要下载9版本的,下载6版本的。9版本不再默认生成lib文件。如果你真的想用9版本,可以自己编译并设置BUILD_SHARED_LIBS选项。
下载压缩包,找个地方解压
4、修改GDAL源码
这里默认你安装的2.X版本或者已经按照第三步链接里的教程安装好了SQLite和PROJ并在源码里做了相应配置。
使用文本编辑软件打开nmake.opt,修改GDAL_HOME的值,修改为你希望打包到的路径
GDAL_HOME = "C:\programs\GDAL\gdal-3.5.0-build"
搜索 END OF STUFF THAT NORMALLY NEEDS TO BE UPDATED ,在该行前面添加以下代码
# Uncomment for OPENCL_AMD support
!IFDEF INCLUDE_OPENCL
OPENCL_DIR="C:\Program Files (x86)\IntelSWTools\system_studio_2020\OpenCL\sdk"
OPENCL_CFLAGS = -I$(OPENCL_DIR)/include -DHAVE_OPENCL
OPENCL_LIB = $(OPENCL_DIR)/lib/x64/OpenCL.lib
!ELSE
OPENCL_DIR=
OPENCL_CFLAGS = -I
OPENCL_LIB =
!ENDIF
其中OPENCL_DIR指向你的OpenCL sdk路径,下面的OPENCL_LIB是从OPENCL_DIR到OpenCL.lib文件的相对路径。
然后在上面那行代码(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,搜索OBJ,等号后加上 gdalwarpkernel_opencl.obj
5、编译
找到VS的x64 Native Tools Command Prompt for VS 2022,右键使用管理员运行,cd到你的gdal包,依次运行以下命令
nmake /f makefile.vc clean
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
若无报错,会在你设置的GDAL_HOME路径下生成如下几个包:
6、测试
cd到上面生成的bin目录下,使用amd运行测试语句,参数里坐标参考和文件路径看着改
gdalwarp -t_srs EPSG:3857 C:\test.tif C:\test_out.tif -wo USE_OPENCL=TRUE -wt Float32 --debug on -r cubic
若出现OpenCL相关的日志输出,就成了
参考
- https://blog.51cto.com/u_15469043/4892922
- https://blog.csdn.net/qq_46209262/article/details/123489785
- https://blog.csdn.net/Icesteam/article/details/112055345
- https://blog.csdn.net/xiaozy12/article/details/108843224
- https://www.javaer101.com/en/article/49652084.html
- https://stackoverflow.com/questions/62439753/how-to-compile-and-use-gdal-with-gpu-supportopencl