(视窗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中添加哪些内容?
谢谢!该bug的固定部分...我有一个新的错误,不知道它是否有关,我的程序现在无法找到某些.dll的。看起来第二部分试图解决这个问题 - 但是当第二部分被添加时,突然间它正在寻找我从来不需要复制的某些lib文件。为什么是这样? 此外,最后一行有一个无与伦比的paren :) – user650261
(只是为了帮助提供更多信息,如果我添加行的错误现在是“无法打开文件glut32.lib”,想知道你是否曾经见过类似的东西? – user650261
我很高兴我的答案可以帮助你。第二种方法是将include路径添加到visual studio项目中。最后一行显示VS在哪里可以找到cuda.lib文件。glut32是来自OpenGL的库。这可能是另一个问题,与cuda无关(你可以使用cuda没有过剩),但是为了你的兴趣,你必须指定链接目录为glut(例如:link_directories(/ path/to/glut))。你需要将相关的dll复制到你的二进制路径中 – Soeren