2017-02-03 51 views
1

(Windows 10, Cuda 8.0, VS 2015, CMake 3.7.0CUDA застрял здание в x86 с использованием CMake

У меня возникли проблемы создания библиотеки с ядром CUDA.

Мой проект имеет верхний уровень 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

Я не уверен, если это правильное решение вашей проблемы. Но он работает для меня, и я работаю с почти той же конфигурацией, что и вы (окна 10, визуальная студия 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 ОМТ):

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

Спасибо! Эта фиксированная часть ошибки ... У меня есть новая ошибка, не уверен, связано ли это, что моя программа теперь не может найти определенные .dll. Похоже, что вторая часть пытается это исправить, но когда добавляется вторая часть, внезапно она ищет определенные файлы lib, которые мне никогда не приходилось копировать. Почему это? Кроме того, последняя строка имеет непревзойденный пароль :) – user650261

+0

(Чтобы помочь предоставить дополнительную информацию, ошибка, если я добавлю свои строки, теперь «Не удается открыть файл glut32.lib», если вы когда-нибудь видели что-либо подобное ? – user650261

+0

Я рад, что мой ответ вам поможет. Мой второй путь - это просто добавить включенные пути к проекту визуальной студии. И последняя строка показывает VS, где можно найти файл cuda.lib. Glut32 - это библиотека из OpenGL. Это, возможно, еще один вопрос и не имеет ничего общего с cuda (вы можете использовать cuda без перенасыщения). Но для вас интерес, вы должны указать каталоги ссылок для перенасыщения (например: link_directories (/ path/to/glut)). И вам нужно скопировать соответствующие dll на ваш двоичный путь. – Soeren

 Смежные вопросы

  • Нет связанных вопросов^_^