写在前面
因为要用TensorRT写自定义层,一定会用到cuda,所以学一下。
目录结构
– <my_dir> – fuc.cu
fuc.h
test.cu
CMakeLists.txt
完整代码
#include <stdio.h>
#include "fuc.h"
__global__ void kernel()
{
printf("hello world!");
}
- fuc.h
extern __global__ void kernel();
#include <stdio.h>
#include "fuc.h"
int main(void)
{
kernel<<<1,1>>>();
cudaDeviceSynchronize();
printf("hello world!\n");
return 0;
}
- CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(helloworld C CXX)
# find_package(<Name>)命令首先会在模块路径中寻找 Find<name>.cmake,这是查找库的一个典型方式
# QUIET 可选字段,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语)
find_package(CUDA QUIET REQUIRED)
# 下面这行注释掉的代码和上面那行代码起到一样的作用
# include(/usr/share/cmake-3.5/Modules/FindCUDA.cmake)
set(CUDA_INCLUDE_DIRS /usr/local/a-9.0/include)
set(CUDA_LIBRARY_DIRS /usr/local/cuda-9.0/lib64)
include_directories(${CUDA_INCLUDE_DIRS})
link_directories(${CUDA_LIBRARY_DIRS})
cuda_add_executable(helloworld test.cu fuc.cu)
运行过程
- cd <my_dir>
- mkdir build && pushd build
- cmake ..
- make
- ./helloworld 得到如下图输出:
- popd
碰到的坑
- 不要把test.cu文件命名为test.cpp,因为cpp文件会使用c++编译器来处理,我们在test.cpp中include了func.h,同时在func.h中声明了__global__函数。
- 使用如下CMakeLists.txt在make的时候会报“main函数重复定义”的错误,我还没懂是为什么。
cmake_minimum_required(VERSION 2.8)
project(helloworld C CXX)
find_package(CUDA QUIET REQUIRED)
set(CUDA_INCLUDE_DIRS /usr/local/a-9.0/include)
set(CUDA_LIBRARY_DIRS /usr/local/cuda-9.0/lib64)
include_directories(${CUDA_INCLUDE_DIRS})
link_directories(${CUDA_LIBRARY_DIRS})
# 原:
# cuda_add_executable(helloworld test.cu fuc.cu)
# 改为以下两行:
file(GLOB_RECURSE CURRENT_INCLUDE ./*.h ./*.hpp ./*.cuh)
cuda_add_executable(cuda_test ${CURRENT_INCLUDE})