(視窗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