Thrust Static Assertion при использовании в cpp файлах - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь скомпилировать и запустить простую программу Cuda / thrust, она работает, когда расширение .cu, но не получается, если расширение источника .cpp. Я уже применил необходимые изменения для файла cpp в cmake, но получаю ошибку

: статическое утверждение не выполнено: не реализовано для этой системы THRUST_STATIC_ASSERT_MSG

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)

project(thrust_test LANGUAGES CXX CUDA)

find_package(CUDA 10.0 REQUIRED)
message(STATUS "CUDA ${CUDA_VERSION_STRING} at ${CUDA_TOOLKIT_ROOT_DIR}")
set(CUDA_LINK_LIBRARIES_KEYWORD PUBLIC)

include_directories(${CUDA_INCLUDE_DIRS})
link_directories(${CUDA_LIBRARY_DIRS})

set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CUDA_SEPARABLE_COMPILATION ON)

set_source_files_properties(
        main.cpp
        PROPERTIES
        CUDA_SOURCE_PROPERTY_FORMAT
        OBJ)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})

и основной.cpp:

__host__
__device__
int foo() {

    // generate random data serially
    thrust::host_vector<int> h_vec(100);
    std::generate(h_vec.begin(), h_vec.end(), rand);

    // transfer to device and compute sum
    thrust::device_vector<int> d_vec = h_vec;
    return thrust::reduce(d_vec.begin(), d_vec.end(), 0, thrust::plus<int>());
}

int main(void) {
    std::cout << "Thrust v" <<  THRUST_MAJOR_VERSION << "." << THRUST_MINOR_VERSION << std::endl;
    std::cout << foo() << std::endl;
    return 0;

}

1 Ответ

1 голос
/ 12 октября 2019

Использование первоклассной языковой поддержки CUDA в cmake (что вы и делаете, когда устанавливаете, что CUDA - это язык, используемый вашим проектом) означает, что cmake собирается использовать компилятор NVidia для .cuфайлы и некоторый другой компилятор (такой как gcc) на других файлах. Когда вы используете add_executable, cmake также проверяет наличие .cu расширений файлов, чтобы выяснить, как правильно связать вместе ваше приложение.

FindCUDA - это более старый набор инструментов, который не обязательно отменяет это поведение. Вы прошли 90% пути к репликации первоклассных языковых функций с использованием макросов, предоставленных FindCUDA, но add_executable не может выполнить некоторые необходимые дополнительные действия, поэтому ваше приложение взрывается. Обычно вы используете макрос CUDA_ADD_EXECUTABLE для обозначения исполняемого файла CUDA при использовании инструментов FindCUDA.

Итак, вот что вы должны сделать: если вы не хотите, чтобы ваш основной файл имел .cu расширение, затем просто переместите вашу функцию foo в отдельный файл .cu со своим собственным заголовком, который вы включили в main.cpp. Вам не нужно будет использовать set_source_files_properties, поскольку код вашего устройства будет правильно разделен на собственный .cu, что позволит cmake предпринять правильные шаги.

Посмотрите эту статью для получения дополнительной информации и ссылок. : https://shawnliu.me/post/cuda-as-a-language-in-cmake/

...