ubunt 上进行c++ cuda编程

目录

概述

cmake代码:

头文件代码:

头文件对应的cuda代码实现:

c++的代码:

运行结果

参考资料


概述

首先先通过一个简单的demo来演示cuda编程是怎么进行的。

cmake代码:

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)

project(helloC++)

find_package(CUDA REQUIRED)

include_directories(${PROJECT_SOURCE_DIR}/include) # 通过源码根目录来定位include2
cuda_add_executable (helloworld helloworld.cpp addition.cu)

注意添加了include文件夹,cmake写法要注意:

include_directories(include1) # 注意当前CMakeLists.txt和include1相对路径关系, 此时必须是在同一个目录下
include_directories(${PROJECT_SOURCE_DIR}/include2) # 通过源码根目录来定位include2

头文件代码:

 修饰符extern "C"是CUDA和C++混合编程时必须的。

 /*
  * addition.h
  *
  */
 
 #ifndef INCLUDES_ADDITION_H_
 #define INCLUDES_ADDITION_H_
 
 /*check if the compiler is of C++*/
 #ifdef __cplusplus
 extern "C" bool addition(int a, int b, int *c);
 
 #endif
 
 
#endif /* INCLUDES_ADDITION_H_ */

头文件对应的cuda代码实现:

#include 
 __global__ void add(int *a, int *b, int *c)
 {
     *c=*a+*b;
 }
 
 extern "C" bool addition(int a, int b, int *c)
 {
     int *d_a, *d_b, *d_c;
     int size=sizeof(int);
     
     cudaMalloc((void **)&d_a, size);
     cudaMalloc((void **)&d_b, size);
     cudaMalloc((void **)&d_c, size);
     
     cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice);
     cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);
     
     add<<<1,1>>>(d_a, d_b, d_c);
     
     cudaMemcpy(c, d_c, size, cudaMemcpyDeviceToHost);
     
     cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);
     return true;
}

其中,带有__global__修饰符的函数称为”核函数“,它负责处理GPU内存里的数据,是并行计算发生的地方。而bool addition(int a, int b, int *c)充当了CPU和GPU之间数据传输的角色。也就是Host和Device之间的数据传输。

最后的是

c++的代码:

/*
  * helloworld.cpp
  *
  */
 
 #include 
 #include 
 
 int main(int argc, char** argv)
 {
     int a=1,b=2,c;
 
     if(addition(a,b,&c))
         std::cout<<"c="<

运行结果

如下:

ubunt 上进行c++ cuda编程_第1张图片

参考资料

CMake 添加头文件搜索路径 include_directories, target_include_directories - 明明1109 - 博客园

代码来源

你可能感兴趣的:(三维重建,SLAM实践分享,c++,c++,开发语言)