6802|7

365

帖子

0

TA的资源

版主

楼主
 

CUDA真香?CUDA与CPU在计算方面的差距 [复制链接]

邀请:@chenzhufly   @skywalker_lee   @wsdymg   @bigbat   参与回复

 

测试平台

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程序的编写也是较大的影响因素,内存的分配,程序逻辑的解耦等等。

视频


 

最新回复

111   详情 回复 发表于 2024-7-9 09:49
点赞 关注(1)

回复
举报

7244

帖子

2

TA的资源

版主

沙发
 

cuda用的就是显卡计算。数据量大的时候显卡的优势就体现出来了。

 
 

回复

7244

帖子

2

TA的资源

版主

板凳
 

不过用cuda可能会有一些问题,显卡不支持啥的,之前我就用cuda,更新显卡驱动后,导致我的电脑频繁蓝屏

点评

我这个是jetson板卡,相对好点,不是自己电脑的显卡  详情 回复 发表于 2024-2-29 22:52
 
 
 

回复

365

帖子

0

TA的资源

版主

4
 
wangerxian 发表于 2024-2-29 10:51 不过用cuda可能会有一些问题,显卡不支持啥的,之前我就用cuda,更新显卡驱动后,导致我的电脑频繁蓝屏

我这个是jetson板卡,相对好点,不是自己电脑的显卡


点评

jetson板卡买来学习人工智能的吗?  详情 回复 发表于 2024-3-1 15:41
 
 
 

回复

7244

帖子

2

TA的资源

版主

5
 
LitchiCheng 发表于 2024-2-29 22:52 我这个是jetson板卡,相对好点,不是自己电脑的显卡

jetson板卡买来学习人工智能的吗?

点评

预研测试用的  详情 回复 发表于 2024-3-4 08:27
 
 
 

回复

365

帖子

0

TA的资源

版主

6
 
wangerxian 发表于 2024-3-1 15:41 jetson板卡买来学习人工智能的吗?

预研测试用的

 
 
 

回复

5263

帖子

236

TA的资源

管理员

7
 

好奇,工程师的电脑配置,是不是都是英伟达的显卡?

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 

111

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表