一个程序来比较cuda/c在GPU/CPU的运行效率

2023-10-27

在网上看了一个比较GPU和CPU执行矩阵运算效率的帖子,亲自跑了一下。

这是一个CUDA语言程序,请保存为“文件名.cu”。我的主机配置如下:

CPU:G2030;内存8GB;显卡:GTX750ti。


代码如下所示:

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

#include <stdio.h>
#include <time.h>

#define N (1024*1024)
#define M (10000)
#define THREADS_PER_BLOCK 1024

void serial_add(double *a, double *b, double *c, int n, int m)
{
    for(int index=0;index<n;index++)
    {
        for(int j=0;j<m;j++)
        {
            c[index] = a[index]*a[index] + b[index]*b[index];
        }
    }
}

__global__ void vector_add(double *a, double *b, double *c)
{
    int index = blockIdx.x * blockDim.x + threadIdx.x;
        for(int j=0;j<M;j++)
        {
            c[index] = a[index]*a[index] + b[index]*b[index];
        }
}

int main()
{
    clock_t start,end;

    double *a, *b, *c;
    int size = N * sizeof( double );

    a = (double *)malloc( size );
    b = (double *)malloc( size );
    c = (double *)malloc( size );

    for( int i = 0; i < N; i++ )
    {
        a[i] = b[i] = i;
        c[i] = 0;
    }

    start = clock();
    serial_add(a, b, c, N, M);

    printf( "c[%d] = %f\n",0,c[0] );
    printf( "c[%d] = %f\n",N-1, c[N-1] );

    end = clock();

    float time1 = ((float)(end-start))/CLOCKS_PER_SEC;
    printf("CPU: %f seconds\n",time1);

    start = clock();
    double *d_a, *d_b, *d_c;


    cudaMalloc( (void **) &d_a, size );
    cudaMalloc( (void **) &d_b, size );
    cudaMalloc( (void **) &d_c, size );


    cudaMemcpy( d_a, a, size, cudaMemcpyHostToDevice );
    cudaMemcpy( d_b, b, size, cudaMemcpyHostToDevice );

    vector_add<<< (N + (THREADS_PER_BLOCK-1)) / THREADS_PER_BLOCK, THREADS_PER_BLOCK >>>( d_a, d_b, d_c );

    cudaMemcpy( c, d_c, size, cudaMemcpyDeviceToHost );


    printf( "c[%d] = %f\n",0,c[0] );
    printf( "c[%d] = %f\n",N-1, c[N-1] );


    free(a);
    free(b);
    free(c);
    cudaFree( d_a );
    cudaFree( d_b );
    cudaFree( d_c );

    end = clock();
    float time2 = ((float)(end-start))/CLOCKS_PER_SEC;
    printf("CUDA: %f seconds, Speedup: %f\n",time2, time1/time2);

    return 0;
}
程序运行结果如下图所示:


CPU的执行时间是GPU执行时间的10倍,这已经是一个数量级的差距了。而且,我相信随着运算量的加大,差距会更加明显。由此看来GPU做矩阵运算确实比CPU快太多。


原帖地址:https://my.oschina.net/zzw922cn/blog/631650



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个程序来比较cuda/c在GPU/CPU的运行效率 的相关文章

  • cuda:扭曲发散开销与额外算术

    当然 扭曲发散 通过if and switch语句 在 GPU 上要不惜一切代价避免 但是扭曲发散的开销是多少 仅调度some执行某些行的线程 与额外无用的算术 考虑以下虚拟示例 版本1 device int get D int A int
  • 以编程方式获取 OS X 中的 GPU 使用百分比

    是否有标准方法可以在 OS X 10 6 和 10 7 上的 Cocoa Objective C 中获取 GPU 使用百分比 享受它吧 GPU 和 RAM 使用情况 在谨慎的 GPU 上不起作用 顺便说一句 因为它不会公开性能监控字典 我的
  • 除了第一个 cudaMalloc 调用之外,还有什么特定的函数可以初始化 GPU?

    由于 GPU 上的一些初始化工作 第一个 cudaMalloc 调用很慢 例如 0 2 秒 是否有任何函数只进行初始化 以便我可以分离时间 cudaSetDevice 似乎将时间减少到 0 15 秒 但仍然没有消除所有初始化开销 致电 cu
  • 如何使用 numba 在 GPU 上推广快速矩阵乘法

    最近 我一直在尝试使用 Numba 库在 Python 中进行 GPU 编程 我一直在他们的网站上使用那里的教程阅读它 目前我陷入了他们的示例 可以在这里找到 https numba pydata org numba doc latest
  • Tensorflow 相同的代码,但从 CPU 设备到 GPU 设备得到不同的结果

    我正在尝试实现一个程序来测试 GPU 设备上的 Tensorflow 性能 数据测试是MNIST数据 使用多层感知器 神经网络 进行监督训练 我跟着这个简单的例子 http gist github com nishidy 8176548ec
  • 有关 CUDA 中统一虚拟寻址 (UVA) 的信息/示例

    我试图理解 CUDA 中统一虚拟寻址 UVA 的概念 我有两个问题 是否有任何示例 伪 代码可以演示这个概念 我在 CUDA C 编程指南中读到 UVA 只能在 64 位操作系统上使用 为什么会这样呢 A 统一虚拟地址空间 http doc
  • C++ 中的按元素运算

    是否有一个预先存在的库可以让我创建具有以下属性的类似数组的对象 运行时大小规范 在实例时选择 之后不会增长或缩小 运算符重载以执行元素明智的操作 即c a b将产生一个向量c with c i a i b i 对全部i 类似地对于 etc
  • 在张量流中调整 3D 数据的大小,如 tf.image.resize_images

    我需要调整一些 3D 数据的大小 例如tf image resize images二维数据的方法 我想我可以尝试跑步tf image resize images在它上循环并交换轴 但我认为一定有一种更简单的方法 简单的最近邻应该没问题 有任
  • cos-extensions 安装 gpu 无法在 GCP Compute Engine 虚拟机上下载驱动程序签名

    我正在 GCP 计算引擎上使用支持 GPU 的虚拟机 作为操作系统 我使用容器优化版本 COS 89 16108 403 47 LTS 它支持通过 SSH 运行 cos extensions install gpu 来安装简单的 GPU 驱
  • 使用 pytorch 获取可用 GPU 内存总量

    我正在使用 google colab 免费 Gpu 进行实验 并想知道有多少 GPU 内存可供使用 torch cuda memory allocated 返回当前占用的 GPU 内存 但我们如何使用 PyTorch 确定总可用内存 PyT
  • Keras 看到我的 GPU,但在训练神经网络时不使用它

    Keras TensorFlow 不使用我的 GPU 为了尝试让我的GPU与tensorflow一起工作 我通过pip安装了tensorflow gpu 我在Windows上使用Anaconda 我有nvidia 1080ti print
  • 在 python docker 镜像上使用 GPU

    我正在使用一个python 3 7 4 slim busterdocker 镜像 我无法更改它 我想知道如何使用我的英伟达 GPU on it 我通常用一个tensorflow tensorflow 1 14 0 gpu py3并用一个简单
  • NvCplGetThermalSettings 返回 false

    问题 您好 我正在尝试使用 Delphi 获取 nividia gtx 980 的 GPU 温度 我看过C 问题 他的解决方案是不使用nvcpl dll 我认为这不是正确的解决方案 因为 nivida 有完整的文档说明如何处理 API 见下
  • iOS 上的 OpenCV - GPU 使用情况?

    我正在尝试开发一个 iOS 应用程序 可以对来自相机的视频执行实时效果 就像 iPad 上的 Photobooth 一样 我熟悉 OpenCV 的 API 但如果大多数处理是在 CPU 上完成而不是在 GPU 上完成 我担心 iOS 上的性
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • 如何读取 GPU 负载?

    我正在编写一个程序 用于监控计算机的各种资源 例如CPU使用率等 我还想监控 GPU 使用情况 GPU 负载 而不是温度 using System using System Collections Generic using System
  • TensorFlow的./configure在哪里以及如何启用GPU支持?

    在我的 Ubuntu 上安装 TensorFlow 时 我想将 GPU 与 CUDA 结合使用 但我却停在了这一步官方教程 http www tensorflow org get started os setup md 这到底是哪里 con
  • 具有 Cuda Thrust 的多个 GPU?

    如何将 Thrust 与多个 GPU 一起使用 这只是使用 cudaSetDevice deviceId 的问题吗 然后运行相关的 Thrust 代码 使用 CUDA 4 0 或更高版本 cudaSetDevice deviceId 接下来
  • Tensorflow:Cuda 计算能力 3.0。所需的最低 Cuda 能力为 3.5

    我正在从源安装tensorflow 文档 https www tensorflow org versions r0 10 get started os setup html installing from sources Cuda驱动版本
  • Tensorflow 训练期间 GPU 使用率非常低

    我正在尝试为 10 类图像分类任务训练一个简单的多层感知器 这是 Udacity 深度学习课程作业的一部分 更准确地说 任务是对各种字体呈现的字母进行分类 数据集称为 notMNIST 我最终得到的代码看起来相当简单 但无论如何我在训练期间

随机推荐

  • qt信号槽同步问题

    目录 信号槽 注意事项 具体例子 线程安全问题的例子 信号槽 在Qt编程中 信号 Signal 和槽 Slot 是一种用于在对象之间进行通信的机制 信号用于发出事件 而槽用于响应这些事件 一个对象可以发出信号 另一个对象可以通过连接到该信号
  • [2018.10.25]高通QFIL刷机:高通sdm845_la2.0用QFIL软件meta_build和flat_build刷机

    1 代码准备 i amss standard oem 高通源码 ii test device amss standard oem对应的二进制文件 高通已经编译 iii caf 高通源码对应的谷歌源码 2 编译源码 将amss standar
  • 如何解决Ubuntu终端显示exprot: command not foundNo command 'pyenv' found, did you mean: Command 'p7env' from

    前天安装pyenv失败后 每次打开终端都会显示这样的错误提示 开始以为命令历史的问题 去 bashrc的历史记录中删了都没用 最后发现应该是安装的问题 解决如下 首先安装git sudo apt install git 然后克隆pyenv仓
  • 奥特曼系列ol进不去服务器,奥特曼系列OL闪退怎么办?解决方案

    奥特曼系列OL闪退怎么办 解决方案 2016 02 14 作者 说玩小编 来源 说玩网 评论 9条 我要评论 奥特曼系列OL闪退怎么办 在玩奥特曼系列OL的时候 是不是有时候会遇到黑屏或者闪退等种种问题 所以小编在这里为大家提供一些解决这些
  • c++指针的使用

    指针的基本概念 指针是一个变量 其值为另一个变量的地址 即内存位置的直接地址 指针的作用 可以通过指针间接访问内存 内存编号是从0开始记录的 一般用十六进制数字表示 可以利用指针变量保存地址 指针变量定义语法 数据类型 变量名 int ma
  • 华为OD机试 - 字符串分割(二)(Java)

    题目描述 给定一个非空字符串S 其被N个 分隔成N 1的子串 给定正整数K 要求除第一个子串外 其余的子串每K个字符组成新的子串 并用 分隔 对于新组成的每一个子串 如果它含有的小写字母比大写字母多 则将这个子串的所有大写字母转换为小写字母
  • LeetCode:用队列实现栈(纯C语言)

    题目链接 225 用队列实现栈 力扣 Leetcode 代码 CV复制黏贴 老套路二话不说 先上代码 typedef int QDataType typedef struct QueueNode struct QueueNode next
  • 找回 macOS 10.12 Sierra 安全性与隐私的设置中

    2019独角兽企业重金招聘Python工程师标准 gt gt gt is damaged and can t be opened You should move it to the Trash 当你出现上述报错时 可以参照下面做法 不少用户
  • Keil或MDK编译报错error: L6050U:

    文章目录 摘要 安装步骤 问题描述 使用软件 下载安装包 解决方案 注意事项 总结 思考 更新日志 摘要 硬件环境 无特殊要求 软件环境 Win10 安装步骤 问题描述 MDK5 报错信息 error L6050U The code siz
  • Linux修改只读文件权限

    我们在修改一些配置文件时经常会遇到文件是只读的 修改之后无法保存修改的问题 我们可以使用 chmod 命令来修改文件 夹 属性 sudo chmod 777 file name 所有用户对这个文件 夹 都有读写权限 sudo chmod 6
  • 2020DCIC智慧海洋建设算法赛学习03-特征工程

    序 特征工程往往是算法比赛中最至关重要的一环 一个好的特征工程能够让你的分数有大幅的提升 而如何做好特征工程 从哪些方面入手构建特征就需要经验积累和学习TOP选手的优秀方案 通过学习TOP选手开源代码的特征工程部分 我们可以发现 对于智慧海
  • 【JAVA】递归与迭代:选择正确的方法来解决问题

    文章目录 递归概念 代码示例 计算阶乘 斐波那契数列 遍历文件系统目录 总结 递归概念 递归是一种方法或算法 在该方法中 函数通过调用自身来解决问题 在递归中 问题被划分为更小的同类子问题 并不断地递归调用函数来解决这些子问题 直到达到终止
  • 探究HTTP常见请求头:从基础到进阶

    探究HTTP常见请求头 从基础到进阶 文章目录 探究HTTP常见请求头 从基础到进阶 1 介绍 什么是HTTP请求头 请求头的作用 2 常见请求头详解 User Agent Accept Language Referer Content T
  • 学习SpringMvc第三战-利用SpringMvc实现CRUD

    目录 一 前期环境搭建 1 替换pom xml的内容 2 导入配置文件 小编上传资源 3 修改xml文件 4 点击创建自动生成代码 5 写一个类用于处理页面跳转 二 正式启动SpringMVC的CRUD 1 建立接口 调用自动生成的接口 2
  • AB测试中如何给样本分组?

    目录 什么是AB测试 什么叫样本相似 为什么要样本相似 怎么实现样本相似 随机化 Randomization 再随机化 Rerandomization 协方差适应随机化 Covariance Adaptive Randomization 更
  • 虚拟串口工具_com0com

    因为这年头 都 2012 年了 应该没什么人有在用 Serial port 串行端口 串口 说 Serial port 大家可能想不起来 但说 COM port 大家应该就知道是什么一回事了吧 就是那个从前在计算机后方一定有的 DB9 插头
  • C++11与最小垃圾回收

    C 11新标准为了做到最小的垃圾回收支持 首先对 安全 的指针进行了定义 安全派生的指针是指向由new分配的对象或其子对象的指针 安全派生指针的操作包括 1 在解引用基础上的引用 比如 p 2 定义明确的指针操作 比如p 1 3 定义明确的
  • oracle的stored outline的创建与维护

    author skate time 2011 09 17 执行计划的稳定 如何确定哪些sql的执行计划不稳定 如何固定执行计划 执行计划直接影响app的性能 有的时候执行计划固定是很有用的 有很多因素影响执行计划的不稳定 像optimize
  • Evaluating Fuzz Testing

    1 介绍 信息量太大回头再写 一天后更新 不想写了差不多就下面这些内容吧 2 背景 2 1 fuzzing流程 fuzzing的核心算法 initSeedCorpus 初始化新的输入 isDone 决定fuzzing是否停止 choose
  • 一个程序来比较cuda/c在GPU/CPU的运行效率

    在网上看了一个比较GPU和CPU执行矩阵运算效率的帖子 亲自跑了一下 这是一个CUDA语言程序 请保存为 文件名 cu 我的主机配置如下 CPU G2030 内存8GB 显卡 GTX750ti 代码如下所示 include cuda run