- 环境介绍
1、ubuntu18.04
2、cmake3.10.2
3、CUDA10.0
4、gcc7.4.0
5、make4.1 - 入门例子 数组相加
mkdir cudademo && cd cudademo
vim cuda_demo_func.cu //cuda的程序以.cu结尾
在cuda_demo_func.cu中写入如下程序:
//只需要一个io库做输入输出的打印
#include <stdio.h>
//cuda的kernel函数要在前面加__global__,数组相加传入的参数有两个数组a和b,它们相加之后的计算结构c,以及它们的数组长度num
__global__ void add(int* a, int* b, int* c, int num){
//没一个thread跑数组的一个对应元素的相加
int i = threadIdx,x;
//越界检查
if(i < num){
//对应数组的一个元素的相加
c[i] = a[i] + b[i];
}
}
int main(void){
//数组长度10
int num = 10;
声明相加的两个数组和计算结果的数组
int a[num], b[num], c[num];
//声明gpu上的对应数组的指针
int *a_gpu, *b_gpu, *c_gpu;
//给相加的两个数组赋值
for(int i = 0; i < num; ++i){
//这里给第一个数组赋值对应的下标
a[i] = i;
//给第二个数组赋值对应下标的平方
b[i] = i * i;
}
//用cudaMalloc给对应gpu上的数组分配内存空间
cudaMalloc((void**)&a_gpu, num * sizeof(int));
cudaMalloc((void**)&b_gpu, num * sizeof(int));
cudaMalloc((void**)&c_gpu, num * sizeof(int));
//用cudaMemcpy把在cpu上赋值完的两个数组a,b拷贝到分配好内存的gpu空间上
cudaMemcpy(a_gpu, a, num * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(b_gpu, b, num * sizeof(int), cudaMemcpyHostToDevice);
//调用kernel函数,分配1个block,num个thread
add<<<1, num>>>(a_gpu, b_gpu, c_gpu, num);
//把计算结果从gpu上考回到cpu上
cudaMemcpy(c, c_gpu, num * sizeof(int), cudaMemcpyDeviceToHost);
//打印结果印证
for(int i = 0; i < num; ++i){
printf("%d + %d = %d\n", a[i], b[i], c[i]);
}
return 0;
}
然后写CMake文件,
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(demo)
FIND_PACKAGE(CUDA REQUIRED)
CUDA_ADD_EXECUTABLE(demo cuda_demo_func.cu)
TARGET_LINK_LIBRARIES(demo)
编译运行:
mkdir build && cd build
cmake ../
make
./demo #运行会打印最后的结果
-- 卷积
网友评论