文档章节

CUDA 计时器

Gaussic
 Gaussic
发布于 2015/09/15 15:14
字数 280
阅读 311
收藏 0

在进行CUDA编程时,需要利用计时方法查看程序运行速度。


首先给出头文件 gputimer.h

#ifndef __GPU_TIMER_H__
#define __GPU_TIMER_H__

struct GpuTimer
{
	cudaEvent_t start;
	cudaEvent_t stop;

	GpuTimer()
	{
		cudaEventCreate(&start);
		cudaEventCreate(&stop);
	}

	~GpuTimer()
	{
		cudaEventDestroy(start);
		cudaEventDestroy(stop);
	}

	void Start()
	{
		cudaEventRecord(start, 0);
	}

	void Stop()
	{
		cudaEventRecord(stop, 0);
	}

	float Elapsed()
	{
		float elapsed;
		cudaEventSynchronize(stop);
		cudaEventElapsedTime(&elapsed, start, stop);
		return elapsed;
	}
};

#endif  /* __GPU_TIMER_H__ */

通用用法

GpuTimer timer;
timer.Start();
// launch the kernal
kernal<<<1, ARRAY_SIZE>>>(d_out, d_in);
timer.Stop();
printf("Time elapsed = %g ms\n", timer.Elapsed()); // 输出

实际运用,计算1000个数的平方

#include <cuda_runtime.h>
#include "device_launch_parameters.h"
#include "gputimer.h"

#include <stdio.h>
#include <stdlib.h>
__global__ void square(float* d_out, float* d_in) {
	int idx = threadIdx.x;
	float f = d_in[idx];
	d_out[idx] = f * f;
}

int main() {

	GpuTimer timer;

	const int ARRAY_SIZE = 1000;
	const int ARRAY_BYTES = ARRAY_SIZE * sizeof(float);

	// generate the input array on the host
	float h_in[ARRAY_SIZE];
	for (int i = 0; i < ARRAY_SIZE; i++) {
		h_in[i] = float(i);
	}
	float h_out[ARRAY_SIZE];

	// declare GPU memory pointers
	float* d_in;
	float* d_out;

	// allocate GPU memory
	cudaMalloc((void **)&d_in, ARRAY_BYTES);
	cudaMalloc((void**)&d_out, ARRAY_BYTES);

	// transfer the array to the GPU
	cudaMemcpy(d_in, h_in, ARRAY_BYTES, cudaMemcpyHostToDevice);

	timer.Start();
	// launch the kernal
	square<<<1, ARRAY_SIZE>>>(d_out, d_in);
	timer.Stop();
	// copy back the result array to the CPU
	cudaMemcpy(h_out, d_out, ARRAY_BYTES, cudaMemcpyDeviceToHost);

	// print out the resulting array
	for (int i = 0; i < ARRAY_SIZE; i++) {
		printf("%f", h_out[i]);
		printf(((i % 4) != 3) ? "\t" : "\n");
	}
	printf("Time elapsed = %g ms\n", timer.Elapsed());
	// free GPU memory allocation
	cudaFree(d_in);
	cudaFree(d_out);
	system("pause");
	return 0;
}

运行结果:

© 著作权归作者所有

Gaussic
粉丝 423
博文 28
码字总数 66971
作品 0
宝山
私信 提问
CUDA实践指南(八)

优化CUDA应用程序: 在每轮应用程序并行化完成后,开发人员可以转向优化实施以提高性能。 由于可以考虑许多可能的优化,对应用程序的需求有充分的了解可以帮助尽可能平滑地实现流程。 但是,...

night李
2018/02/28
0
0
图形处理器开发环境--CUDA

CUDA™ 工具包是一种针对支持CUDA功能的GPU(图形处理器)的C语言开发环境。CUDA开发环境包括: · nvcc C语言编译器 · 适用于GPU(图形处理器)的CUDA FFT和BLAS库 · 分析器 · 适用于GPU...

匿名
2008/11/21
15.6K
0
C# Win32控制台线程计时器代码示例

在C#中提供了三种类型的计时器: 1、基于 Windows 的标准计时器(System.Windows.Forms.Timer) 2、基于服务器的计时器(System.Timers.Timer) 3、线程计时器(System.Threading.Timer) 一、基于...

微wx笑
2015/01/03
0
0
linux下的时钟编程

1.时钟相关的API函数原型 #include unsigned int sleep(unsigned int seconds);unsigned int alarm(unsigned int seconds);int usleep(useconds_t usec); include int getitimer(int which,......

Jeff_Linux
2014/07/29
0
0
RIP计时器的游戏

目标:理解RIP抑制计时器 测试环境:如图1所示: 图1 测试环境 环境说明:R1上有一个192.168.1.0/24的网络,R1、R2、R3之间运行RIP协议,R2和R3通过R1到达192.168.1.0网络。 测试目标:首先需...

taolinba213
2017/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
30分钟前
4
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
4
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
13
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
13
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部