AMC*_*ded 6 c++ cuda cmake thrust
我正在尝试编译并运行一个简单的 Cuda/thrust 程序,当扩展名是 时它可以工作,.cu但当源扩展名是.cpp. 我已经在 cmake 中应用了 cpp 文件所需的更改,但我得到了
错误:静态断言失败:此系统未实现 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})
Run Code Online (Sandbox Code Playgroud)
和main.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;
}
Run Code Online (Sandbox Code Playgroud)
在 cmake 中使用 CUDA 一流语言支持(这就是您在确定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/
| 归档时间: |
|
| 查看次数: |
4050 次 |
| 最近记录: |