VS2017 CUDA编程学习4:CUDA并行处理初探 - 向量加法实现


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加速的计算机视觉编程》

Guess you like

Origin blog.csdn.net/DU_YULIN/article/details/120711754