我在通过 CMake 链接设备上的构造函数时遇到问题。仅当在类内调用函数时才会引起麻烦。你有什么想法吗?
我尝试使用 nvcc ...-dc 和 -dlink 手动编译和链接,效果很好。
输出失败
ptxas fatal : Unresolved extern function '_ZN4TestC1Ev'
CMake Error at genetic_program_lib_generated_test.cu.o.debug.cmake:282 (message):
Error generating file
/article/src/build/CMakeFiles/genetic_program_lib.dir/src/./genetic_program_lib_generated_test.cu.o
CMake
cmake_minimum_required(VERSION 3.22)
project(GeneticProgramming)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/article/src/build")
set(CMAKE_BUILD_TYPE debug)
include_directories(include)
# add cuda source files to variable
file(GLOB CUDA_SOURCES src/genetic_program.cu src/test.cu src/test2.cu)
file(GLOB MAIN main/main.cpp)
# find the cuda package
find_package(CUDA REQUIRED)
cuda_add_library(genetic_program_lib ${CUDA_SOURCES})
set_target_properties(genetic_program_lib PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
# create the executable
add_executable(out ${MAIN})
target_link_libraries(out genetic_program_lib)
主要
#include <genetic_program.hpp>
int main()
{
genetic_program();
return 0;
}
遗传程序.hpp
#pragma once
#include <iostream>
int genetic_program();
遗传程序.cu
#include <genetic_program.hpp>
#include <test.cuh>
int genetic_program()
{
test<<<1,1>>>();
return 0;
}
测试.cuh
#pragma once
#include <iostream>
#include <test2.cuh>
__global__ void test();
测试.cu
#include <test.cuh>
__global__ void test(){
printf("Hello World!\n");
Test t;
t.test2t();
}
test2.cuh
#pragma once
#include <iostream>
class Test
{
public:
__device__ Test();
__device__ void test2t();
};
test2.cu
#include <test2.cuh>
__device__ Test::Test()
{
printf("Test::Test()\n");
}
__device__ void Test::test2t()
{
printf("Test::test2t()\n");
}
编辑:更新命名约定。
CUDA
语言支持和 CUDA_SEPARABLE_COMPILATION
属性均随 CMake 3.8 一起提供,并且不能与旧版 CUDA
包一起使用。
cmake_minimum_required(VERSION 3.22)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/article/src/build")
set(CMAKE_BUILD_TYPE debug)
project(GeneticProgramming LANGUAGES CUDA CXX)
include_directories(include)
# add cuda source files to variable
file(GLOB CUDA_SOURCES src/genetic_program.cu src/test.cu src/test2.cu)
file(GLOB MAIN main/main.cpp)
# cuda_add_library(genetic_program_lib ${CUDA_SOURCES})
add_library(genetic_program_lib ${CUDA_SOURCES})
set_target_properties(genetic_program_lib PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
# create the executable
add_executable(out ${MAIN})
target_link_libraries(out genetic_program_lib)
对我有用。
请注意,像
CMAKE_BUILD_TYPE
这样的全局变量需要在 project
调用之前设置才能生效。