将GPU多线程的计算能力与CPU进行比较

#include<iostream>
#include<time.h>

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

using namespace std;

#define threadSize 100
#define arrSize 100

void addWithCPU(float (*array)[arrSize]);
void addWithGPU(float (*array)[arrSize]);
__global__ void addKernel(float (*p)[arrSize]);

//共threadSize组,每一组有arrSize个数字,组内进行二重循环计算
//对GPU而言,共分配threadSize个线程,每个线程只需计算一组数据。
//时间复杂度为O(threadSize * arrSize^2)

int main()
{

    //Used in CPU
    float array1[threadSize][arrSize];

    //Used in GPU
    float array2[threadSize][arrSize];

    //Initialize array
    for(int i = 0; i < threadSize; i++)
    {
        for(int j = 0; j < arrSize; j++)
        {
            array1[i][j] = array2[i][j] = 1;
        }
    }

    time_t startCPU, endCPU, startGPU, endGPU;

    startCPU = clock();

    addWithCPU(array1);

    endCPU = clock();

    startGPU = clock();

    addWithGPU(array2);

    endGPU = clock();

    cout << "Time used for CPU is: " << endCPU - startCPU << endl;
    cout << "Time used for GPU is: " << endGPU - startGPU << endl;

    return 1;
}

//CPU computation
void addWithCPU(float (*array)[arrSize])
{
    for(int i = 0; i < threadSize; i++)
    {
        for(int j = 0; j < arrSize; j++)
        {
            for(int k = 0; k < arrSize; k++)
            {
                array[i][j] += array[i][k];
            }
        }
    }
}

//GPU kernel
__global__ void addKernel(float (*p)[arrSize])
{
    int i = threadIdx.x;
    
    for(int j = 0; j < arrSize; j++)
    {
        for(int k = 0; k < arrSize; k++)
        {
            p[i][j] += p[i][k];
        }
    }
}

//GPU computation
void addWithGPU(float (*array)[arrSize])
{
    float (*p)[arrSize] = nullptr;

    cudaSetDevice(0);

    cudaMalloc((void**)&p, threadSize * arrSize * sizeof(float));

    cudaMemcpy(p, array, threadSize * arrSize * sizeof(float), cudaMemcpyHostToDevice);

    addKernel<<<1, arrSize>>>(p);

    cudaMemcpy(array, p, threadSize * arrSize * sizeof(float), cudaMemcpyDeviceToHost);

}
  1. threadSize = 1 , arrSize = 1
    在这里插入图片描述

  2. threadSize = 1 , arrSize = 1000
    在这里插入图片描述

  3. threadSize = 10 , arrSize = 1000
    在这里插入图片描述

  4. threadSize = 100 , arrSize = 100
    在这里插入图片描述

  5. threadSize = 100 , arrSize = 500
    在这里插入图片描述

  6. threadSize = 100 , arrSize = 1000
    在这里插入图片描述

  7. threadSize = 1000 , arrSize = 100
    在这里插入图片描述

  8. threadSize = 1000 , arrSize = 500
    在这里插入图片描述

  9. threadSize = 1000 , arrSize = 1000
    在这里插入图片描述

  10. threadSize = 10000 , arrSize = 100在这里插入图片描述

通过上述时间比对,可以看出GPU的基本处理时间大约在2.8秒左右,这包括设备启动时间,设备关闭时间。随着数据量的增加,CPU和GPU的处理时间差逐渐缩小,可以看出GPU的多线程在处理海量数据时存在优势。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值