Я использую Visual Studio 2017, набор инструментов платформы v141 и CUDA Toolkit 9.2. Я заметил, что конструктор перемещения и назначение перемещения отсутствуют при компиляции тяга :: device_vector с nvcc. Причина - условие, которое проверяет значение макроса __cplusplus в Thrust lib.
Как объясняется в документы, я установил для стандарта языка C++ значение / std: C++ 17 и дополнительно установил / Zc: __ cplusplus, чтобы макрос был правильно определен в msvc, то есть 201703. Однако для файлов, скомпилированных nvcc, макрос установлен на 199711.
Я создал простой кейс, который воспроизводит проблему.
test.cuh:
#pragma once
#include <iostream>
void test();
test.cu:
#include "test.cuh"
void test()
{
std::cout << "CU file: " << __cplusplus << std::endl;
}
main.cpp:
#include "test.cuh"
int main()
{
test();
std::cout << "CPP file: " << __cplusplus << std::endl;
return 0;
}
Выходы:
CU file: 199711
CPP file: 201703
Я ищу решение, которое применимо также к CMake с FindCUDA.
Если я установил флаг / Zc: __ cplusplus в свойствах проекта: C / C + / Host / Additional Compiler Options, тогда макрос __cplusplus будет 201402 при компиляции с nvcc. Это уже решило бы мою проблему, но все же есть несоответствие. Как я могу добиться этого с помощью CMake?
Мне удалось установить __cplusplus на 201402 при компиляции с nvcc, передав -Xcompiler = / Zc: __ cplusplus
Если это ваше решение, вы бы добавили его в качестве ответа?
Мне удалось установить __cplusplus на 201402, передав -Xcompiler / Zc: __ cplusplus в nvcc. Поскольку nvcc поддерживает только C++ 14, это, вероятно, лучшее, что я могу получить с CUDA 9.2.
Как бы то ни было, этого не происходит с CUDA 9.2 в Linux. Вы проверили подробный вывод сборки и выяснили, что nvcc действительно получает параметр
-std
и не игнорирует его? Насколько мне известно, nvcc поддерживает только C++ 11 и C++ 14