(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?
Спасибо! Эта фиксированная часть ошибки ... У меня есть новая ошибка, не уверен, связано ли это, что моя программа теперь не может найти определенные .dll. Похоже, что вторая часть пытается это исправить, но когда добавляется вторая часть, внезапно она ищет определенные файлы lib, которые мне никогда не приходилось копировать. Почему это? Кроме того, последняя строка имеет непревзойденный пароль :) – user650261
(Чтобы помочь предоставить дополнительную информацию, ошибка, если я добавлю свои строки, теперь «Не удается открыть файл glut32.lib», если вы когда-нибудь видели что-либо подобное ? – user650261
Я рад, что мой ответ вам поможет. Мой второй путь - это просто добавить включенные пути к проекту визуальной студии. И последняя строка показывает VS, где можно найти файл cuda.lib. Glut32 - это библиотека из OpenGL. Это, возможно, еще один вопрос и не имеет ничего общего с cuda (вы можете использовать cuda без перенасыщения). Но для вас интерес, вы должны указать каталоги ссылок для перенасыщения (например: link_directories (/ path/to/glut)). И вам нужно скопировать соответствующие dll на ваш двоичный путь. – Soeren