# #c #cmake #linker-errors #sycl #dpc
Вопрос:
Фон
Я пытаюсь изучить SYCL с помощью серверной части CUDA (я скомпилировал компилятор dpc , используя эти инструкции, и добавление векторов сработало). Однако на следующий день я не смог заставить первый пример из книги работать с помощью CMake, однако использование командной строки и прямой вызов компилятора решили проблему.
#include <CL/sycl.hpp>
#include <iostream>
#include <string>
using namespace sycl;
const std::string secret =
"Ifmmp-!xpsme"12J(n!tpssz-!Ebwf/!"
"J(n!bgsbje!J!dbo(u!ep!uibu/!.!IBM1";
const auto sz = secret.size();
int main() {
queue Q;
char* result = malloc_shared<char>(sz, Q);
std::memcpy(result, secret.data(), sz);
Q.parallel_for(sz, [=](autoamp; i) {
result[i] -= 1;
}).wait();
std::cout << result << 'n';
}
Я использую этот скрипт для настройки переменных среды:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/shino/software/sources/llvm/build/lib/
export DPCPP_HOME=/home/shino/software/sources
export CUDA_LIB_PATH=/usr/local/cuda/lib64/stubs/
export CXX=/home/shino/software/sources/llvm/build/bin/clang
export CC=/home/shino/software/sources/llvm/build/bin/clang
export CUDA_PATH=/usr/local/cuda
И вот мой CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(sycl-convolution)
add_executable(convolution main.cpp)
target_include_directories(convolution PRIVATE /home/shino/software/sources/llvm/sycl/include)
target_compile_features(convolution PRIVATE cxx_std_17)
target_compile_options(convolution PRIVATE -fsycl -fsycl-targets=nvptx64-nvidia-cuda --cuda-path=$ENV{CUDA_PATH})
target_link_directories(convolution PRIVATE /home/shino/software/sources/llvm/build/lib/)
Вот первые несколько строк ошибок компоновщика:
/usr/bin/ld: CMakeFiles/convolution.dir/main.cpp.o: in function `main':
main-4cf7ed.cpp:(.text 0x122): undefined reference to `cl::sycl::event::wait()'
/usr/bin/ld: CMakeFiles/convolution.dir/main.cpp.o: in function `main::{lambda(auto:1amp;)#1} cl::sycl::queue::submit<cl::sycl::queue::parallel_for_impl<cl::sycl::detail::auto_name, main::{lambda(auto:1amp;)#1}, 1>(cl::sycl::range<1>, main::{lambda(auto:1amp;)#1}, cl::sycl::detail::code_location constamp;)::{lambda(cl::sycl::handleramp;)#1}>(cl::sycl::queue::parallel_for_impl<cl::sycl::detail::auto_name, main::{lambda(auto:1amp;)#1}, 1>(cl::sycl::range<1>, main::{lambda(auto:1amp;)#1}, cl::sycl::detail::code_location constamp;)::{lambda(cl::sycl::handleramp;)#1}, cl::sycl::detail::code_location const)':
main-4cf7ed.cpp:(.text 0x3c0): undefined reference to `cl::sycl::event::event()'
/usr/bin/ld: main-4cf7ed.cpp:(.text 0x3cc): undefined reference to `cl::sycl::queue::is_host() const'
/usr/bin/ld: main-4cf7ed.cpp:(.text 0x47b): undefined reference to `cl::sycl::queue::submit_impl_and_postprocess(std::function<void (cl::sycl::handleramp;)>, cl::sycl::detail::code_location constamp;, std::function<void (bool, bool, cl::sycl::eventamp;)> constamp;)'
/usr/bin/ld: main-4cf7ed.cpp:(.text 0x543): undefined reference to `cl::sycl::queue::submit_impl(std::function<void (cl::sycl::handleramp;)>, cl::sycl::detail::code_location constamp;)'
/usr/bin/ld: CMakeFiles/convolution.dir/main.cpp.o: in function `void cl::sycl::handler::parallel_for_lambda_impl<cl::sycl::detail::auto_name, main::{lambda(auto:1amp;)#1}, 1>(cl::sycl::range<1>, main::{lambda(auto:1amp;)#1})':
main-4cf7ed.cpp:(.text 0xa23): undefined reference to `cl::sycl::handler::GetRangeRoundingSettings(unsigned longamp;, unsigned longamp;, unsigned longamp;)'
Как мне это исправить? Мое внутреннее чутье подсказывает мне, что компилятор вызывает компоновщик по-другому при прямом вызове, и я не указываю какую-то очень важную часть процесса компоновки.
Вызов компилятора в подробном режиме дал следующую команду ссылки:
"/usr/bin/ld" -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /lib/x86_64-linux-gnu/crt1.o /lib/x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib64 -L/home/shino/software/sources/llvm/build/bin/../lib -L/lib -L/usr/lib /tmp/main-7d74d3.o /tmp/a-cacdd3.o -lstdc -lm -lgcc_s -lgcc -lsycl -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/9/crtend.o /lib/x86_64-linux-gnu/crtn.o
Помимо ошибок компоновщика, было намного больше предупреждений, что говорит о том, что компилятор находится не в правильном «режиме». Я не знаю, с чего начать копать дальше.
Ответ №1:
Вам не хватает реальных библиотек для связи, укажите их с target_link_libraries
помощью директивы. Дополнительную информацию можно найти в документации CMake.
Обратите внимание, что target_link_directories
этого недостаточно — он указывает только пути к библиотекам, которые должен искать компоновщик.
Более конкретно, прочитав команду ссылки, которую вы опубликовали, вы должны добавить:
target_link_libraries(convolution PRIVATE sycl)
Дополнение OP: Добавление SYSTEM
в target_include_directories
директиву приведет к отключению предупреждений:
target_include_directories(convolution SYSTEM PRIVATE /home/shino/software/sources/llvm/sycl/include)