CUDA学习笔记(二)CUDA并行编程1

CUDA并行编程

教材《GPU高性能编程CUDA实战》第四章 CUDA C并行编程 基于CPU和GPU的矢量求和对比

1.基于CPU的矢量求和

#include <studio.h>
#include <time.h>
#include<iostream>
using namespace std;
#define N 50000

void add(int *a, int *b, int *c) {
	int tid = 0;
	while (tid < N) {//也可以用for循环
		c[tid] = a[tid] + b[tid];
		tid += 1;
	}
}
int main(void) {

	int a[N], b[N], c[N];
	//在CPU上给数组'a'和'b'赋值
	for (int i = 0; i < N; i++) {
		a[i] = -i;//0,-1,-2,-3,-4,-5,-6,-7,-8,-9
		b[i] = i*i;//0,1,4,9,26,25,36,49,64,81
	}
	clock_t t0 = clock();
	add(a, b, c);


	//显示结果
	for (int i = 0; i < N; i++) {
		printf("%d+%d=%d\n", a[i], b[i], c[i]);
	}
	clock_t t1 = clock();
	cout << "Running time is: " << static_cast<double>(t1 - t0) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
	return 0;
}

2.基于GPU的矢量求和

#include "cuda_runtime.h"
#include "device_launch_parameters.h"//包含blockIdx.x
#include "book.h"//包含了studio.h
#include <time.h>
#include<iostream>
using namespace std;
#define N 50000//N<65535

__global__ void add(int *a, int *b, int *c) {
	int tid = blockIdx.x;
	if (tid < N)
		c[tid] = a[tid] + b[tid];
}


int main(void) {
	
	int a[N], b[N], c[N];
	int *dev_a, *dev_b, *dev_c;
	//在GPU上分配内存
	HANDLE_ERROR(cudaMalloc((void**)&dev_a, N * sizeof(int)));
	HANDLE_ERROR(cudaMalloc((void**)&dev_b, N * sizeof(int)));
	HANDLE_ERROR(cudaMalloc((void**)&dev_c, N * sizeof(int)));
	
	//在CPU上给数组'a'和'b'赋值
	for (int i = 0; i < N; i++) {
		a[i] = -i;//0,-1,-2,-3,-4,-5,-6,-7,-8,-9
		b[i] = i*i;//0,1,4,9,26,25,36,49,64,81
	}
	clock_t t0 = clock();
	//将数组'a'和'b'复制到GPU
	HANDLE_ERROR(cudaMemcpy(dev_a, a, N * sizeof(int), cudaMemcpyHostToDevice));//主机拷贝到设备
	HANDLE_ERROR(cudaMemcpy(dev_b, b, N * sizeof(int), cudaMemcpyHostToDevice));

	add << <N, 1 >> > (dev_a, dev_b, dev_c);

	//将数组'c'从GPU复制到CPU
	HANDLE_ERROR(cudaMemcpy(c,dev_c, N * sizeof(int), cudaMemcpyDeviceToHost));
	
	//显示结果
	for (int i = 0; i < N; i++) {
		printf("%d+%d=%d\n", a[i], b[i], c[i]);
	}

	//释放在GPU上分配的内存
	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_c);
	clock_t t1 = clock();
	cout << "Running time is: " << static_cast<double>(t1 - t0) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值