CUDA真香?CUDA与CPU在计算方面的差距

在这里插入图片描述

视频

CUDA真香? CUDA与CPU在计算方面的差距

测试平台

Jetson Orin Nano

测试代码

代码仓库(如果对你有用麻烦点个STAR!)
https://github.com/LitchiCheng/CUDA_Test
如下为部分测试代码:

#include <cstdio>
#include "cuda_runtime.h"

#include <sys/time.h>
#include <time.h>

#include <math.h>

#include "utility/timecost.h"

__global__ void kernelAdd(float * A, float * B, float * C)
{
    int ix=threadIdx.x+blockDim.x*blockIdx.x;
    int iy=threadIdx.y+blockDim.y*blockIdx.y;
    int idx=ix+iy*blockDim.x*gridDim.x;
    C[idx]=cos(A[idx])+sin(B[idx]);
    // if(idx == 2077){
        // printf("idx[%d],ix[%d],iy[%d],bdx[%d],bdy[%d],bix[%d],biy[%d],gdx[%d],gdy[%d],C[%f]\r\n", \
        // idx,ix,iy,blockDim.x,blockDim.y,blockIdx.x,blockIdx.y,gridDim.x,gridDim.y,C[idx]);
    // }
}


int main()
{

for(int cycle=0;cycle < 32;cycle++)
{
    int gridSize2Dx = 16*cycle;
    int gridSize2Dy = 16*cycle;
    //blocksize MAX 1024
    int blockSize2Dx = 32;
    int blockSize2Dy = 32;
    int sum = gridSize2Dx*gridSize2Dy*blockSize2Dx*blockSize2Dy;
    int sum_bytes = sum*sizeof(float);
    printf("size %d \r\n", sum);

    float* A_host=(float*)malloc(sum_bytes);
    for(int i=0;i<sum;i++){
        A_host[i]=(float)i;
    }
  
    float* B_host=(float*)malloc(sum_bytes);
    for(int i=0;i<sum;i++){
        B_host[i]=i;
    }

    float* C_host=(float*)malloc(sum_bytes);

    float *A_dev=NULL;
    float *B_dev=NULL;
    float *C_dev=NULL;
    {
        timecost t1("cuda");
        cudaMalloc((void**)&A_dev,sum_bytes);
        cudaMemcpy(A_dev,A_host,sum_bytes,cudaMemcpyHostToDevice);
        cudaMalloc((void**)&B_dev,sum_bytes);
        cudaMemcpy(B_dev,B_host,sum_bytes,cudaMemcpyHostToDevice);

        cudaMalloc((void**)&C_dev,sum_bytes);
        dim3 gridSize2D(gridSize2Dx, gridSize2Dy);
        dim3 blockSize2D(blockSize2Dx, blockSize2Dy);
        kernelAdd<<<gridSize2D, blockSize2D>>>(A_dev,B_dev,C_dev);
        int ret = 0;
        ret = cudaMemcpy(C_host,C_dev,sum_bytes,cudaMemcpyDeviceToHost);
    }

    for(int i=0;i<sum;i++){
        // printf("C[%d]:%f \n", i, C_host[i]);
        C_host[i] = 0.0f;
    }

    {
        timecost t2("cpu");
        for(int i=0;i<sum;i++){
            C_host[i]=cos(A_host[i])+sin(B_host[i]);
        }
    }

    for(int i=0;i<sum;i++){
        // printf("C[%d]:%f \n", i, C_host[i]);
        C_host[i] = 0.0f;
    }

    cudaFree(A_dev);
    free(A_host);
    cudaFree(B_dev);
    free(B_host);
    cudaFree(C_dev);
    free(C_host);
}
    return 0;
}

使用python脚本进行耗时统计(橙黄色cpu耗时,蓝色cuda耗时,x轴为计算量逐渐递增)
在这里插入图片描述

结论

经过上面的测试,cuda和cpu简单比较下来,数据量越大,cuda越有优势,数据量很小的时候还不如用cpu,当然cuda程序的编写也是较大的影响因素,内存的分配,程序逻辑的解耦等等。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值