如标题中所述,我尝试使用cudas动态并行性创建一个简单的程序。 为简单起见,我有一个example.cpp:
int main() {
Kernel kernel;
kernel.launchDynamic();
return 0;
}
我有一个Kernel.cu和Kernel.h
kernel.h当
#include <iostream>
class Kernel{
public:
void launchDynamic();
}
Kernel.cu
#include "Kernel.h"
__global__ void child() {
int idx = threadIdx.x + blockIdx.x * blockDim.x;
printf("I am child %d \n", idx);
}
__global__ void parent() {
int idx = threadIdx.x + blockIdx.x * blockDim.x;
printf("I am parent %d \n", idx);
child<<<1,32>>>();
}
void launchDynamic() {
parent<<<1,32>>>();
cudaDeviceSynchronize();
}
cudaDeviceSynchronize()应该在打印文本之前阻止程序退出。好吧,我无法测试代码,所以可能会有一些错误。
无论如何,我的主要问题是cmakelists.txt 据我所知,为了使用动态并行,我需要5或更高的计算能力,我需要设置-rdc = true,我需要链接-lcudadevrt。
我试图模仿C.3.3.2中http://docs.nvidia.com/cuda/pdf/CUDA_C_Programming_Guide.pdf中的命令。编译和链接还发现了这篇文章C:/ Program Files / NVIDIA_GPU_Computing_Toolkit / CUDA / v6.5 / lib / x64 / cudadevrt.lib。 我的cmakelists看起来像:
cmake_minimum_required(VERSION 2.8)
#set project name
project(CudaExample)
# find cuda
find_package(CUDA REQUIRED)
#collect all sources
FILE(GLOB SOURCES "*.cu" "*.cpp" "*.c" "*.h")
cuda_add_executable(CudaExample ${SOURCES})
#set nvcc settings
set(CUDA_NVCC_FLAGS "-arch=sm_50 -rdc=true Kernel.cu -lcudadevrt -o kernel")
#link host with cudadevrt
target_link_libraries(CudaExample C:/Program Files/NVIDIA_GPU_Computing_Toolkit/CUDA/v6.5/lib/x64/cudadevrt.lib)
但显然存在一个很大的错误,因为我不知道如何正确链接主机和设备代码。我希望有人可以帮助我解决这个问题,因为我尝试了很多很多,但却没有找到任何帮助我解决问题的东西。
----------------------------------------------- - - 编辑 - - - - - - - - - - - - - - - - - - - - - - - ------------
通过FindCuda.cmake阅读后,我编辑了我的Cmakelists.txt,现在看起来像:
cmake_minimum_required(VERSION 2.8)
#set project name
project(CudaExample)
#search sources
file(GLOB_RECURSE SOURCES *.cpp *.h *.cu)
# find cuda
find_package(CUDA REQUIRED)
#set nvcc settings
if(CUDA_FOUND)
MESSAGE(STATUS "Found Cuda ${CUDA_VERSION_STRING}")
MESSAGE(STATUS "Cuda Toolkit location: ${CUDA_TOOLKIT_ROOT_DIR}")
SET(CUDA_VERBOSE_BUILD ON)
SET(CUDA_SEPARABLE_COMPILATION ON)
CUDA_ADD_LIBRARY(KERNELS Kernel.cu STATIC)
message(STATUS "Separable status ${CUDA_SEPARABLE_COMPILATION}")
else(CUDA_FOUND)
message(STATUS "Cuda not Found")
endif(CUDA_FOUND)
#create executable
cuda_add_executable(CudaExample ${SOURCES} OPTIONS -gencode arch=compute_35,code=sm_35)
#link host with cuda libs
target_link_libraries(CudaExample ${CUDA_LIBRARIES})
但是当我尝试构建时,我收到一个错误,即可以生成中间文件。 CMake to generate a MSVC CUDA project that targets newer devices有一个类似的错误,似乎是FindCuda.cmake中的一个错误,所以我在stonexjr的评论中建议编辑了FindCuda。
现在我收到错误KERNELS_generated_Kernel.cu.obj.cmake:264:Fehler:生成文件C时出错:/ Programm/CCode/Workspace/CudaDynamicTest-build/CMakeFiles/KERNELS.dir //./ KERNELS_generated_Kernel.cu。 obj,这是因为中间文件可能在另一个目录中创建而未找到?我的Cmakelists.txt中有其他错误吗?