cuda动态并行和cmake的问题?

时间:2015-02-21 19:47:14

标签: cuda cmake dynamic-parallelism

如标题中所述,我尝试使用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中有其他错误吗?

0 个答案:

没有答案