首页 > 其他 > 详细

CUDA并行计算基础代码

时间:2015-06-19 02:05:08      阅读:221      评论:0      收藏:0      [点我收藏+]
#include<cuda_runtime.h>
#include<windows.h>
#include<iostream>
using namespace std;
const int nMax = 30000;
__global__ void addKernel(float *aaa,float *bbb, float *ccc)
{
	int i = blockIdx.x;
	for (int j = 0; j<10000; j++)ccc[i] = aaa[i] * bbb[i];
}
void add(float *a, float *b,float *c,int i){
	for (int j = 0;j<10000;j++)c[i] = a[i] * b[i];
	//return ;
}
int main(){
	float a[nMax], b[nMax], c[nMax];
	float *devA, *devB, *devC;
	clock_t startT, endT;
	for (int i = 0; i < nMax; i++){
		a[i] = i*1.001092653;
		b[i] = i*i;
	}
	cudaMalloc((void**)&devA, nMax*sizeof(float));
	cudaMalloc((void**)&devB, nMax*sizeof(float));
	cudaMalloc((void**)&devC, nMax*sizeof(float));

	cudaMemcpy(devA,a,nMax*sizeof(float),cudaMemcpyHostToDevice);
	cudaMemcpy(devB, b, nMax*sizeof(float), cudaMemcpyHostToDevice);
	startT = clock();
	addKernel<<<nMax,1>>>(devA, devB, devC);
	cout << c[nMax - 1] << endl;
	endT = clock();
	cudaMemcpy(c, devC, nMax*sizeof(float), cudaMemcpyDeviceToHost);
	cout << (float)endT - startT << endl;
	
	for (int i = 0; i < nMax; i++){
		a[i] = i*1.141592653;
		b[i] = i*i;
		c[i] = 0;
	}
	startT = clock();
	for (int i = 0; i < nMax; i++){
		add(a, b, c, i);
	}
	endT = clock();
	cout << endT - startT << endl;
	cin >> a[0];
	return 0;
}

?这里对比了一下并行计算和串行计算,并行计算的优势明显,对于30000*10000的数据量,cpu计算在一毫秒以内,cpu却花费了657毫秒。

但是并行计算主要的瓶颈在于内存和gpu缓存之间通信的开销,数据如下:

在设备上分配内存 ? ? ? ? ? ? 143?

将数据写入设备 ? ? ? ? ? ? ? ? 0

计算 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0

从设备将数据写入主机 ? ? ? 865

?

如何降低数据通信的开销,还请大牛指教

CUDA并行计算基础代码

原文:http://bbezxcy.iteye.com/blog/2220720

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!