文章目录
VS2017 CUDA编程学习1:CUDA编程两变量加法运算
VS2017 CUDA编程学习2:在GPU上执行线程
VS2017 CUDA编程学习3:CUDA获取设备上属性信息
前言
今天开始见识下CUDA编程的并行处理能力,这里做下笔记并分享给大家。
CUDA实现向量加法
为了体现CUDA并行处理能力,这里也实现了CPU上向量加法程序,通过分别统计运行时间来证明CUDA的并行处理优势。
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#define N 1000
//内核(Gpu设备)函数实现向量加法
__global__ void GpuAdd(int* d_a, int* d_b, int* d_c)
{
int idx = blockIdx.x;
d_c[idx] = d_a[idx] + d_b[idx];
printf("blockIdx %d\n", idx);
}
//CPU函数实现向量加法
void CpuAdd(int* h_a, int* h_b, int* h_c)
{
for (int i = 0; i < N; i++)
{
h_c[i] = h_a[i] + h_b[i];
printf("index %d\n", i);
}
}
int main()
{
//定义host变量数组
int h_a[N], h_b[N], h_c[N];
//定义Gpu设备指针
int* d_a, *d_b, *d_c;
//为Gpu设备指针分配内存
cudaMalloc(&d_a, N * sizeof(int));
cudaMalloc(&d_b, N * sizeof(int));
cudaMalloc(&d_c, N * sizeof(int));
//初始化host变量数组
for (int i = 0; i < N; i++)
{
h_a[i] = 2 * i*i;
h_b[i] = i;
}
//将host变量数组数据拷贝到Gpu设备指针中
cudaMemcpy(d_a, h_a, N*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, N * sizeof(int), cudaMemcpyHostToDevice);
printf("Start Vector addition on GPU \n");
//统计内核函数运行时间
clock_t d_start = clock();
//运行内核(设备)函数,配置内核参数:N个block, 每个block 1个线程
GpuAdd << <N, 1 >> > (d_a, d_b, d_c);
//等待所有内核函数执行完成后继续运行CPU主线程
cudaThreadSynchronize();
clock_t d_end = clock();
double d_cost = (double) (d_end - d_start) / CLOCKS_PER_SEC;
printf("End Vector addition on GPU \n");
//记录CPU运行时间
int h_c1[N];
clock_t h_start = clock();
CpuAdd(h_a, h_b, h_c1);
clock_t h_end = clock();
double h_cost = (double)(h_end - h_start) / CLOCKS_PER_SEC;
//打印内核函数运行时间和CPU函数运行时间
printf("No of Elements in Array:%d \n Device time %f seconds\n host time %f seconds\n\n",
N, d_cost, h_cost);
//将Gpu设备指针中数据拷贝到host变量数组中
cudaMemcpy(h_c, d_c, N * sizeof(int), cudaMemcpyDeviceToHost);
//在输出窗口打印结果
/*for (int i = 0; i < N; i++)
{
printf("The sum of %d element is %d + %d = %d \n", i, h_a[i], h_b[i], h_c[i]);
}*/
//最后释放Gpu设备上分配的内存空间
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
//system("pause");
return 0;
}
2. 结果展示
从结果上看出,使用CUDA在Gpu设备上执行时间近花费了不到5s,而在CPU上执行却花费了55s, CUDA的并行运行能力还是很强大的。
总结
这里只是简单验证CUDA的并行处理能力,在CUDA内核参数配置时要尤其注意设备支持的block和每个block支持的线程数限制,否则程序会崩溃的,这也是本人在上述程序中设置宏定义N的值时验证过的。
学习资料
《基于GPU加速的计算机视觉编程》