Cuda编程3(数组数乘,带宽计算,事件计时)

Cuda编程3(数组数乘,带宽计算,事件计时)

说明:本打算用此程序计算两张显卡之间数据传输的带宽,但是本机只有一张显卡,他依然算出来了一个带宽值,望请指点。事件计时函数的基本用法
__global__ void sclarMultiply(float *input, float scalar, float* output, int size)
{
	int idx = blockIdx.x*blockDim.x + threadIdx.x;//线程编号=块编号*块内的线程数+当前线程在此块内的序号
	if (idx < size)
	{
		output[idx] = input[idx] * scalar;//数组中的每个元素乘以一个标量(实际用途:照片增加对比度也是每个元素乘一个倍数)
	}
}
void scalarMultiply()
{

	const int size = 1000;
	const float scalar = 2.0f;

	//分配主机内存
	float* h_input = new float[size];
	float* h_output = new float[size];

	//初始化输入数据
	for (int i = 0; i < size; i++)
	{
		h_input[i] = i;
	}

	//分配设备内存
	float* d_input, *d_output;
	cudaMalloc(&d_input, size*sizeof(float));
	cudaMalloc(&d_output, size * sizeof(float));
	
	//初始化cuda事件,start,stop
	cudaEvent_t start, stop;
	cudaEventCreate(&start);
	cudaEventCreate(&stop);
	
	//根据数组大小实例化核函数用的参数,单个块内有256个线程,有数组索引大小/块大小 +1个块(与下方的numBlocks含义相同)
	const int block_size = 256;
	const int numBlocks = (size + block_size - 1) / block_size;

	//记录开始时间
	cudaEventRecord(start);
	//将输入数据拷贝至设备
	cudaMemcpy(d_input, h_input, size * sizeof(float), cudaMemcpyHostToDevice);

	//执行GPU运算
	sclarMultiply << <numBlocks, block_size >> > (d_input, scalar, d_output, size);
	
	cudaMemcpy(h_output, d_output, size * sizeof(float), cudaMemcpyDeviceToHost);
	//记录结束时间
	cudaEventRecord(stop);
	cudaEventSynchronize(stop);

	//计算事件时间间隔
	float millseconds = 0;
	cudaEventElapsedTime(&millseconds, start, stop);
	std::cout << "用时:" << millseconds<< "   毫秒" << std::endl;

	std::cout << " scalar multiply data:   " << std::endl;
	for (int i = 0; i < size; i++)
	{
		std::cout << h_output[i] << "   ";
	}
	std::cout << std::endl;
	delete[] h_input;
	delete[] h_output;
	cudaFree(d_input);
	cudaFree(d_output);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值