目录
概述
cmake代码:
头文件代码:
头文件对应的cuda代码实现:
c++的代码:
运行结果
参考资料
首先先通过一个简单的demo来演示cuda编程是怎么进行的。
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_ */
#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之间的数据传输。
最后的是
/*
* helloworld.cpp
*
*/
#include
#include
int main(int argc, char** argv)
{
int a=1,b=2,c;
if(addition(a,b,&c))
std::cout<<"c="<
如下:
CMake 添加头文件搜索路径 include_directories, target_include_directories - 明明1109 - 博客园
代码来源