cuda学习笔记1 - hello world实战

目录

  • 写在前面
  • 目录结构
  • 完整代码
  • 运行过程
  • 碰到的坑

写在前面

       因为要用TensorRT写自定义层,一定会用到cuda,所以学一下。

目录结构

       – – fuc.cu
                               fuc.h
                               test.cu
                               CMakeLists.txt

完整代码

  • fuc.cu
#include 
#include "fuc.h"

__global__ void kernel()
{
    printf("hello world!");
}
  • fuc.h
extern __global__ void kernel();
  • test.cu
#include 
#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()命令首先会在模块路径中寻找 Find.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
  • 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})

你可能感兴趣的:(cuda编程)