2017-02-03 64 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