做了一个小的cuda编程的例程代码,验证了一个gpu的运算速度。
vs新建工程。
新建工程后会有一个自带的例程代码,这个代码是直接调用cuda做运算的,这里对代码做了简单的修改,让cpu和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;
}