vistual studio2015 cuda编程初体验 gpu速度的简单验证

做了一个小的cuda编程的例程代码,验证了一个gpu的运算速度。

vs新建工程。
vistual studio2015 cuda编程初体验 gpu速度的简单验证
新建工程后会有一个自带的例程代码,这个代码是直接调用cuda做运算的,这里对代码做了简单的修改,让cpu和gpu做相同的运算,然后比较它们两个的运算时间,最后时间比较结果如下:
vistual studio2015 cuda编程初体验 gpu速度的简单验证
第2个是gpu的速度
代码如下:

timeCount.h

#pragma once
#include<time.h>

// 一个用于计时的类
class TimeCount
{
public:
 clock_t bgTime;
 //设定当前时间为开始时间
 void setBegin()
 {
  //记录当前的时间
  bgTime = clock();
 }
 //构造函数
 TimeCount()
 {
  //把时间设定为当前时刻
  setBegin();
 }
 //获取时间间隔
 double getTimeSpan()
 {
  //获取当前的时间
  clock_t currTime = clock();
  //计算时间间隔并返回
  return (double)(currTime - bgTime) / CLOCKS_PER_SEC;
 }
};

kernel.cu

#include "device_launch_parameters.h"
#include"timeCount.h"
#include <stdio.h>
#define DATA_LEN 10000
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}

//cpu里面完成的两个数组相加的过程
void cpuAddProcess(int* dstAns, int *a, int *b,int dataNum)
{
 //遍历所有的数据
 for (int i = 0; i < dataNum; ++i) dstAns[i] = a[i] + b[i];
}

//初始化cuda的设备
void initCuda()
{
 //选择后面要运行的gpu
 cudaSetDevice(0);
}

int main()
{
 //新建用于相加的数组
 int a[DATA_LEN];
 int b[DATA_LEN];
 //对数组赋值
 for (int i = 0; i < DATA_LEN; ++i)
 {
  a[i] = i;
  b[i] = i;
 }
 //新建用于存储结果的数组
 int dataAns[DATA_LEN];
 //记录开始的时间
 TimeCount timeCounter;
 //用cpu来跑数组
 for (int i = 0; i < DATA_LEN; ++i)
  cpuAddProcess(dataAns, a, b, DATA_LEN);
 //记录时间
 printf("%lf\n", timeCounter.getTimeSpan());
 //做cuda设备的初始化
 initCuda();
 //新建用于存储结果的cuda数组
 int *cudaAns;
 //用cuda的函数给目标向量开辟空间
 cudaMalloc((void**)(&cudaAns), DATA_LEN * sizeof(int));
 //新建两个数据数组的cuda空间
 int *cudaA;
 int *cudaB;
 cudaMalloc((void**)(&cudaA), DATA_LEN * sizeof(int));
 cudaMalloc((void**)(&cudaB), DATA_LEN * sizeof(int));
 //把数据复制到cuda内存中
 cudaMemcpy(cudaA, a, DATA_LEN * sizeof(int), cudaMemcpyHostToDevice);
 cudaMemcpy(cudaB, b, DATA_LEN * sizeof(int), cudaMemcpyHostToDevice);
 //开始计时
 timeCounter.setBegin();
 //调用cuda的运算过程
 for(int i=0;i<DATA_LEN;++i)
  addKernel << <1, DATA_LEN >> > (cudaAns, cudaA, cudaB);
 //显示用时
 printf("%lf\n", timeCounter.getTimeSpan());

    return 0;
}

上一篇:QT:Your MaintenanceTool appears to be older than 3.0.2.


下一篇:Visual studio2015配置opencv