2017-02-03 48 views
1

(视窗10,Cuda的8.0,VS 2015年,CMake的3.7.0CUDA使用CMake的

我无法建立一个库,具有CUDA内核陷建设86。

我的项目有一个顶层的CMakeLists.txt其包括子的CMakeLists.txt

在顶层:

cmake_minimum_required(VERSION 3.0) 
project (robot) 
find_package(CUDA REQUIRED) 
#...some more stuff 
include(${PROJECT_SOURCE_DIR}/projects/subproject/CMakeLists.txt) 

然后,在子项目的CMakeLists.txt:

set(SUBPROJECT_SOURCE_DIR ${PROJECT_SOURCE_DIR}/projects/subproject) 

file(GLOB_RECURSE SUBPROJECT_HEADER ${SUBPROJECT_SOURCE_DIR}/*.h) 
file(GLOB_RECURSE SUBPROJECT_SOURCE ${SUBPROJECT_SOURCE_DIR}/*.cpp) 
file(GLOB_RECURSE SUBPROJECT_CUDA ${SUBPROJECT_SOURCE_DIR}/*.cu) 
file(GLOB_RECURSE SUBPROJECT_CUDA_HEADER ${SUBPROJECT_SOURCE_DIR}/*.cuh) 

cuda_add_library(subproject STATIC ${SUBPROJECT_HEADER} ${SUBPROJECT_SOURCE} ${SUBPROJECT_CUDA_HEADER} ${SUBPROJECT_CUDA}) 
target_include_directories(subproject PRIVATE ${SUBPROJECT_SOURCE_DIR}/include) 
#some other includes and target_includes here... 

target_link_libraries(subproject <some links here>) 

在我的源代码目录中,有一个.cuh和一个.cu文件。这些都基于简单的VectorAdd函数测试:

kernel.cuh:

#include <stdio.h> 
#include <cuda.h> 
#include <cuda_runtime.h> 
#include <device_launch_parameters.h> 

__global__ void VectorAdd(int *a, int *b, int *c, int n); 
int test(); 

而且kernel.cu:

#include "kernel.cuh" 

#define SIZE 1024 



__global__ void VectorAdd(int *a, int *b, int *c, int n) { 
    int i = threadIdx.x; 

    if (i < n){ 
     c[i] = a[i] + b[i]; 
    } 
} 

int test() { 

    int *a, *b, *c; 
    int *d_a, *d_b, *d_c; 

    a = (int *)malloc(SIZE * sizeof(int)); 
    b = (int *)malloc(SIZE * sizeof(int)); 
    c = (int *)malloc(SIZE * sizeof(int)); 

    cudaMalloc(&d_a, SIZE * sizeof(int)); 
    cudaMalloc(&d_b, SIZE * sizeof(int)); 
    cudaMalloc(&d_c, SIZE * sizeof(int)); 

    for (int i = 0; i < SIZE; ++i) { 
     a[i] = i; 
     b[i] = i; 
     c[i] = 0; 

    } 

    cudaMemcpy(d_a, a, SIZE * sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_b, b, SIZE * sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_c, c, SIZE * sizeof(int), cudaMemcpyHostToDevice); 

    VectorAdd<<< 1, SIZE >>>(d_a, d_b, d_c, SIZE); 

    cudaMemcpy(c, d_c, SIZE * sizeof(int), cudaMemcpyDeviceToHost); 


    for (int i = 0; i < 10; ++i) { 
     printf("c[%d] = %d\n", i, c[i]); 
    } 

    free(a); 
    free(b); 
    free(c); 

    cudaFree(d_a); 
    cudaFree(d_b); 
    cudaFree(d_c); 

    return 0; 

} 

我包括Kernel.cuh在我的项目,不同的C++文件。试图编译我的解决方案,我得到以下错误:

Severity Code Description Project File Line Suppression State 
Error LNK1112 module machine type 'X86' conflicts with target machine type 'x64' subproject C:\path_to_proj\build\CMakeFiles\subproject.dir\projects\subproject\src\Release\subproject_generated_kernel.cu.obj 1 

然后导致无法找到.lib的事实。这个错误的原因是什么?我需要在CMakeLists中添加哪些内容?

回答

3

我不确定,如果这是您的问题的正确解决方案。但它适用于我,我使用几乎相同的配置(Windows 10,Visual Studio 13,cuda 8.0,cmake 3.7)。

在我的cmake文件中,我除了你的find cuda命令以外的代码。也许第一行适合于您的错误按摩)

set(CUDA_64_BIT_DEVICE_CODE ON CACHE STRING "Compile device code in 64 bit mode" FORCE) 

,并完成我的CUDA-cmake的名单(最后一行也可以帮助,它强制链接找到的x64 CUDA LIB):

find_path(CUDA_CUT_INCLUDE_DIR 
     helper_cuda.h 
     PATHS "$ENV{NVSDKCOMPUTE_ROOT}" "$ENV{NVSDKCUDA_ROOT}" "$ENV{NVCUDASAMPLES_ROOT}" 
     PATH_SUFFIXES "common/inc" "CUDA Samples/v7.5/common/inc" "v7.5/common/inc" 
     DOC "Location of helper_cuda.h" 
     NO_DEFAULT_PATH 
    ) 

INCLUDE_DIRECTORIES(${CUDA_INCLUDE_DIRS} ${CUDA_CUT_INCLUDE_DIR}) 
LINK_DIRECTORIES(${CUDA_INCLUDE_DIRS}/../lib/x64) 

我希望这可以帮助你。祝你好运!

+0

谢谢!该bug的固定部分...我有一个新的错误,不知道它是否有关,我的程序现在无法找到某些.dll的。看起来第二部分试图解决这个问题 - 但是当第二部分被添加时,突然间它正在寻找我从来不需要复制的某些lib文件。为什么是这样? 此外,最后一行有一个无与伦比的paren :) – user650261

+0

(只是为了帮助提供更多信息,如果我添加行的错误现在是“无法打开文件glut32.lib”,想知道你是否曾经见过类似的东西? – user650261

+0

我很高兴我的答案可以帮助你。第二种方法是将include路径添加到visual studio项目中。最后一行显示VS在哪里可以找到cuda.lib文件。glut32是来自OpenGL的库。这可能是另一个问题,与cuda无关(你可以使用cuda没有过剩),但是为了你的兴趣,你必须指定链接目录为glut(例如:link_directories(/ path/to/glut))。你需要将相关的dll复制到你的二进制路径中 – Soeren