Как собрать GDAL с OpenCL для пользовательской установки CUDA?

Я пытаюсь создать GDAL против OpenCL, чтобы получить растровые операции с ускорением графического процессора, в зависимости от Cuda. Мне удалось завершить ./configure и начать компиляцию с make. Однако при компиляции gdalinfo происходит сбой компиляции, поскольку не удается найти символы OpenCL.

Я почти уверен, что это потому, что где-то отсутствует флаг -lOpenCL, но (1) я не знаю, где; и (2) я не знаю, что изменить. Итак, мой вопрос: как правильно настроить команды сборки для использования OpenCL?

Ошибка сбоя сборки:

echo '#!/bin/sh' > gdal-config
echo 'CONFIG_LIBS="libgdal.la"' >> gdal-config
echo 'CONFIG_DEP_LIBS=" -lcrypto -lpoppler -ljson-c -lfreexl -lqhull -lqhull -L/usr/lib/x86_64-linux-gnu -lgeos_c -lwebp -lodbc -lodbcinst -lkmlbase -lkmldom -lkmlengine -lkmlxsd -lkmlregionator -lexpat -lxerces-c -lpthread -lopenjp2 -ljasper -L/usr/lib -L/usr/lib/x86_64-linux-gnu/hdf5/serial -lnetcdf -lhdf5_hl -lhdf5 -lpthread -lsz -lz -ldl -lm -lcurl -L/usr/lib/x86_64-linux-gnu/hdf5/serial -lhdf5 -lmfhdfalt -ldfalt -logdi -lgif -ljpeg -lgeotiff -ltiff -lpng -L/usr/lib/x86_64-linux-gnu -lpq -lzstd -llzma -lz -lpthread -lm -lrt -ldl  -lspatialite -lsqlite3 -lpcre   -L/usr/lib/x86_64-linux-gnu -lcurl        cuda    -lxml2     "' >> gdal-config
echo 'CONFIG_PREFIX="gdal-2.4.2"' >> gdal-config
echo 'CONFIG_CFLAGS="-Iport -Igcore -Ialg -Iogr -Iogr/ogrsf_frmts -Ifrmts/vrt -Iapps"' >> gdal-config
echo 'CONFIG_DATA="data"' >> gdal-config
echo 'CONFIG_VERSION="'`cat ../VERSION`'"' >> gdal-config
echo 'CONFIG_OGR_ENABLED=yes' >> gdal-config  # Deprecated.  Always true.
echo 'CONFIG_GNM_ENABLED=yes' >> gdal-config
echo 'CONFIG_FORMATS=" gxf gtiff hfa aigrid aaigrid ceos ceos2 iso8211 xpm sdts raw dted mem jdem envisat elas fit vrt usgsdem l1b nitf bmp airsar rs2 ilwis rmf leveller sgi srtmhgt idrisi gsg ingr ers jaxapalsar dimap gff cosar pds adrg coasp tsx terragen blx msgn til r northwood saga xyz hf2 kmlsuperoverlay ctg e00grid zmap ngsgeoid iris map cals safe sentinel2 derived prf sigdem ignfheightasciigrid mrf webp wcs wms plmosaic wmts rda eeda grib bsb openjpeg jpeg2000 netcdf hdf5 hdf4 gif jpeg png pcraster  pcidsk rik ozi pdf rasterlite mbtiles postgisraster arg"' >> gdal-config
cat gdal-config.in >> gdal-config
chmod a+x gdal-config
/bin/bash libtool --mode=compile --silent --tag=CXX g++ -std=c++11 -Iport -Igcore -Ialg -Iogr -Iogr/ogrsf_frmts -Ignm -Iapps -DHAVE_AVX_AT_COMPILE_TIME -DHAVE_SSSE3_AT_COMPILE_TIME -DHAVE_SSE_AT_COMPILE_TIME -g -O2  -Wall -Wextra -Winit-self -Wunused-parameter -Wformat -Werror=format-security -Wno-format-nonliteral -Wlogical-op -Wshadow -Werror=vla -Wdate-time -Wfloat-conversion -Wmissing-declarations -Wnon-virtual-dtor -Woverloaded-virtual -fno-operator-names -Wzero-as-null-pointer-constant -Wsuggest-override  -Ifrmts/vrt -DGNM_ENABLED -Iport -I/usr/include/openjpeg-2.1 -I/usr/include  -DGDAL_COMPILATION -DHAVE_XERCES -I/usr/include -I/usr/include/xercesc -Iport -I/usr/include/openjpeg-2.1 -I/usr/include  -DGDAL_COMPILATION -I/usr/include/json-c -Iogr/ogrsf_frmts/geojson -Iogr/ogrsf_frmts/generic -Ignm -DHAVE_GEOS=1 -I/usr/include -c -o gdalinfo_bin.lo gdalinfo_bin.cpp
/bin/bash libtool --mode=link --silent g++ -std=c++11  gdalinfo_bin.lo  libgdal.la  -o gdalinfo
.libs/libgdal.so: undefined reference to `clCreateProgramWithSource'
.libs/libgdal.so: undefined reference to `clReleaseKernel'
.libs/libgdal.so: undefined reference to `clGetSupportedImageFormats'
.libs/libgdal.so: undefined reference to `clGetKernelWorkGroupInfo'
.libs/libgdal.so: undefined reference to `clCreateImage2D'
.libs/libgdal.so: undefined reference to `clEnqueueMapBuffer'
.libs/libgdal.so: undefined reference to `clEnqueueNDRangeKernel'
.libs/libgdal.so: undefined reference to `clGetPlatformIDs'
.libs/libgdal.so: undefined reference to `clGetDeviceInfo'
.libs/libgdal.so: undefined reference to `clCreateBuffer'
.libs/libgdal.so: undefined reference to `clReleaseCommandQueue'
.libs/libgdal.so: undefined reference to `clReleaseContext'
.libs/libgdal.so: undefined reference to `clReleaseEvent'
.libs/libgdal.so: undefined reference to `clGetDeviceIDs'
.libs/libgdal.so: undefined reference to `clReleaseMemObject'
.libs/libgdal.so: undefined reference to `clCreateCommandQueue'
.libs/libgdal.so: undefined reference to `clBuildProgram'
.libs/libgdal.so: undefined reference to `clFinish'
.libs/libgdal.so: undefined reference to `clGetProgramBuildInfo'
.libs/libgdal.so: undefined reference to `clEnqueueReadBuffer'
.libs/libgdal.so: undefined reference to `clReleaseProgram'
.libs/libgdal.so: undefined reference to `clCreateContext'
.libs/libgdal.so: undefined reference to `clSetKernelArg'
.libs/libgdal.so: undefined reference to `clCreateKernel'
collect2: error: ld returned 1 exit status
GNUmakefile:82: recipe for target 'gdalinfo' failed
make[1]: *** [gdalinfo] Error 1
make[1]: Leaving directory 'apps'
GNUmakefile:112: recipe for target 'apps-target' failed
make: *** [apps-target] Error 2

Я знаю, что эти символы установлены правильно, потому что они перечислены, если я сделаю, например:

$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64   # Inform GDAL of Cuda
$ export PATH=/usr/local/cuda/bin:$PATH          # Inform GDAL of Cuda
$ cat /usr/local/cuda/include/CL/*  | grep -i clCreateProgramWithSource
clCreateProgramWithSource(cl_context        /* context */,
    ... )

Я также думаю, что GDAL правильно настроен, чтобы знать об этом, потому что ./configure --with-opencl --with-opencl-include=/usr/local/cuda/include/ --with-opencl-lib=cuda может найти OpenCL.

Поэтому я думаю, что это терпит неудачу, потому что к следующей команде не добавлено -lOpenCL, в то время как, по-видимому, gdalinfo хочет этого.

/bin/bash libtool --mode=link --silent g++ -std=c++11  gdalinfo_bin.lo  libgdal.la  -o gdalinfo

Итак, мой последний вопрос: как я могу изменить конфигурацию сборки, чтобы включить -lOpenCL в большем количестве мест?


person Arthur    schedule 27.10.2020    source источник
comment
-lOpenCL должен стоять после библиотек, использующих его, в строке --mode=link, например после libgdal.la. Не уверен, как работает libtool, но, возможно, добавьте его как libOpenCL.lo.   -  person Andreas    schedule 29.10.2020
comment
Спасибо, это уже помогает! Любая идея, как я должен достичь этого? У меня не больше опыта создания файлов, чем у ./configure && make.   -  person Arthur    schedule 01.11.2020


Ответы (1)


Вам не нужно изменять какие-либо make-файлы GDAL, чтобы использовать OpenCL — скрипт сборки GDAL довольно хорошо находит все, что вам нужно для этого. Единственный вариант для configure скрипта, который вам нужен, это --with-opencl=yes — этот yes необходим. Опции --with-opencl-include=ARG и --with-opencl-lib=ARG полезны только тогда, когда у вас нестандартная установка OpenCL - я их вообще не использовал и все связал правильно.

CUDA имеет собственную версию заголовков OpenCL и библиотеку загрузчика, поэтому вы можете использовать их, даже если на вашем компьютере нет стандартного OpenCL (предоставляемого, например, средством обновления программного обеспечения Linux — apt). В случае, если CUDA был установлен в каком-то нестандартном месте (например, в вашем домашнем каталоге), вы должны сообщить об этом скрипту GDAL configure:

./configure \
  --with-opencl=yes \
  --with-opencl-include=${HOME}/apps/cuda/targets/x86_64-linux/include \
  --with-opencl-lib="-L${HOME}/apps/cuda/targets/x86_64-linux/lib -lOpenCL" \
  <other options if needed>

Также вам не нужно ничего сообщать скрипту configure о вашей CUDA — библиотека-загрузчик OpenCL должна найти все необходимые библиотеки CUDA во время выполнения, используя свою внутреннюю механику.

person HEKTO    schedule 02.11.2020
comment
Вы также связали это с CUDA? Потому что у меня проблемы с этим подходом. Запуск ./configure --with-opencl=yes ведет к checking for CL/opencl.h... no configure: error: cannot find CL/opencl.h. Как вы установили CUDA (run.sh, репозитории ubuntu, репозитории nvidia, ...)? - person Arthur; 03.11.2020
comment
Я попытался с ./configure --with-opencl=yes --with-opencl-include=/usr/local/cuda/include/ --with-opencl-lib=cuda и получил ту же ошибку, что и в исходном сообщении. Без дополнительных флагов configure по-прежнему не может найти opencl. - person Arthur; 03.11.2020
comment
Это сработало! Gdal успешно скомпилирован с OpenCL cuda. Для меня последней командой была ./configure --with-opencl=yes --with-opencl-include=/usr/local/cuda/include --with-opencl-lib="-L/usr/local/cuda/lib64 -lOpenCL". Теперь я сталкиваюсь с другими проблемами (*** Error in `gdalwarp': double free or corruption (out): 0x00000000012bfce0 ***) при запуске инструментов, но я думаю, что это другая проблема. Спасибо! - person Arthur; 04.11.2020