一个不错的关于CPU和GPU(CUDA)的性能比较讨论话题

2023-11-18

http://topic.csdn.net/u/20081027/23/67ff3857-3c71-4d5c-acf6-095f3497c7a9.html
这里是今天的一个论坛的一个帖子,大家可以讨论一下:)
1.那些程序适合用cpu来做,那些适合用gpu来做
2.如果用gpu来做,需要注意那些东西
3.如果需要优化,需要那些思路:)

在lz的代码的基础上做了一些变化,大家可以自己测试一下,就知道那些工作适合用cpu做,那些是适合用gpu来做。
这里面的LOOP_ADD_TIME 从1->10->100->1000->10000....
大家可以做一个测试,看看最后的效果是怎么样的,可以画一个曲线图出来:)

过一段时间,还可以把这个代码在修改一下,添加更多的内容进去,再看看两者的效果怎么样:)
C/C++ code
   
   

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

// Simple utility function to check for CUDA runtime errors
// void checkCUDAError(const char* msg)
#define LOOP_ADD_TIME 100

// Part 2 of 2: implement the kernel
__global__ void reverseArrayBlock( int * d_a)
{
int dx = blockDim.x * blockIdx.x + threadIdx.x;

for ( int i = 1 ; i <= LOOP_ADD_TIME; i ++ )
{
d_a[dx]
+= i;
}
}

int gpu_test()
{
clock_t start, finish;
double duration;

// pointer for host memory and size
int * h_a,transfer;
int dimA = 512 * 21056 ; // 256K elements (1MB total)

// pointer for device memory
int * d_a;

// define grid and block size
int numThreadsPerBlock = 512 ;

// Part 1 of 2: compute number of blocks needed based on array size and desired block size
int numBlocks = dimA / numThreadsPerBlock;
printf(
" blocks: %d/n " ,numBlocks);

// allocate host and device memory
size_t memSize = numBlocks * numThreadsPerBlock * sizeof ( int );
h_a
= ( int * ) malloc(memSize);
CUDA_SAFE_CALL(cudaMalloc( (
void ** ) & d_a, memSize ));

// Initialize input array on host
for ( int i = 0 ; i < dimA; ++ i)
{
h_a[i]
= i;
// printf("%d ",h_a[i]);
}

start
= clock();
// unsigned int timer;
// CUT_SAFE_CALL(cutCreateTimer(&timer));
// CUT_SAFE_CALL(cutStartTimer(timer));
// Copy host array to device array
CUDA_SAFE_CALL(cudaMemcpy( d_a, h_a, memSize, cudaMemcpyHostToDevice ));

// launch kernel
dim3 dimGrid(numBlocks);
dim3 dimBlock(numThreadsPerBlock);
reverseArrayBlock
<<< dimGrid, dimBlock >>> ( d_a );

// device to host copy
CUDA_SAFE_CALL(cudaMemcpy(h_a, d_a, memSize, cudaMemcpyDeviceToHost ));

// CUT_SAFE_CALL(cutStopTimer(timer));
finish = clock();
duration
= ( double )(finish - start) * 1000 / CLOCKS_PER_SEC;
printf(
" gpu time is %f ms/n " , duration );
// printf( "gpu time is %f ms/n", cutGetTimerValue(timer));


int * h_a2;

// allocate host memory
h_a2 = ( int * ) malloc(memSize);


// Initialize input array on host
for ( int i = 0 ; i < dimA; ++ i)
{
h_a2[i]
= i;
// printf("%d ",h_a[i]);
}
for ( int j = 0 ; j < dimA ; ++ j )
{
for ( int k = 1 ; k <= LOOP_ADD_TIME; k ++ )
{
h_a2[j]
+= k;
}
}

for ( int j = 0 ; j < dimA ; ++ j )
{
if (h_a[j] != h_a2[j])printf( " error!/n " );
}
// free host memory
free(h_a2);

// free host memory
free(h_a);

// free device memory
cudaFree(d_a);

return 0 ;

}

// //
// Program main
// //
int cpu_test()
{
clock_t start, finish;
double duration;

// pointer for host memory and size
int * h_a,transfer;
int dimA = 512 * 21056 ; // 256K elements (1MB total)

// allocate host memory
size_t memSize = 512 * 21056 * sizeof ( int );
h_a
= ( int * ) malloc(memSize);


// Initialize input array on host
for ( int i = 0 ; i < dimA; ++ i)
{
h_a[i]
= i;
// printf("%d ",h_a[i]);
}
printf(
" /n " );

start
= clock();
for ( int j = 0 ; j < dimA ; ++ j )
{
for ( int k = 1 ; k <= LOOP_ADD_TIME; k ++ )
{
h_a[j]
+= k;
}
}

finish
= clock();
duration
= ( double )(finish - start) * 1000 / CLOCKS_PER_SEC;
printf(
" cpu time is %f ms/n " , duration );


// free host memory
free(h_a);

return 0 ;

}
// //
// Program main
// //
int main( int argc, char ** argv)
{

CUT_DEVICE_INIT(argc, argv);
gpu_test();

cpu_test();

CUT_EXIT(argc, argv);
}




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

一个不错的关于CPU和GPU(CUDA)的性能比较讨论话题 的相关文章

  • 在 Java 中运行 CUDA 代码的最简单方法是什么?

    我有一些用 C 语言编写的 CUDA 代码 它似乎工作正常 它是普通的旧 C 而不是 C 我正在运行一个 Hadoop 集群 并且想要整合我的代码 因此理想情况下我希望在 Java 中运行它 长话短说 系统太复杂 目前 C 程序解析日志文件
  • ImportError:libcublas.so.9.0:无法打开共享对象文件

    目前我在 Gpu 支持系统中安装了 cuda 8 0 和 cuda 9 0 我在从 keras 模块导入时遇到了这个错误 它说无法加载本机张量流运行时 我收到的错误日志是 Traceback most recent call last Fi
  • 估计 GPU 的 FLOPS 效率(CUDA 示例)

    在我看来 我并不完全理解 FLOPS 的概念 在CUDA SAMPLES中 有矩阵乘法示例 0 Simple matrixMul 在此示例中 每个矩阵乘法的 FLOP 浮点运算 数量通过以下公式计算 double flopsPerMatri
  • 在 OS X 上的 virtualenv 中安装 scrapy 加密时发生错误 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在安装 scrapypip in virtualenv on OS X 10 11 当它安装密码学时 它说 buil
  • 如何获取要执行的 PTX 文件

    我知道如何生成 ptx文件来自 cu以及如何生成 cubin文件来自 ptx 但我不知道如何获得最终的可执行文件 更具体地说 我有一个sample cu文件 编译为sample ptx 然后我使用 nvcc 来编译sample ptx to
  • 在 Windows 上的 Qt Creator 中编译 Cuda 代码

    几天来我一直在尝试获取在 32 位 Windows 7 系统上运行的 Qt 项目文件 我希望 需要在其中包含 Cuda 代码 这种组合要么非常简单 以至于没有人愿意在网上放一个例子 要么非常困难 似乎没有人成功 不管怎样 我发现的唯一有用的
  • CUDA错误:在python中使用并行时初始化错误

    我的代码使用 CUDA 但运行速度仍然很慢 因此 我将其更改为使用 python 中的多处理 pool map 并行运行 但我有CUDA ERROR initialization error 这是函数 def step M self ite
  • 使用常量内存打印地址而不是cuda中的值

    我试图在代码中使用常量内存 并从内核分配常量内存值 而不是使用 cudacopytosymbol include
  • 指定 NVCC 用于编译主机代码的编译器

    运行 nvcc 时 它始终使用 Visual C 编译器 cl exe 我怎样才能让它使用GCC编译器 设置CC环境变量到gcc没有修复它 我在可执行文件帮助输出中也找不到任何选项 在 Windows 上 NVCC 仅支持 Visual C
  • CUDA:如何检查计算能力是否正确?

    使用较高计算能力编译的 CUDA 代码将在计算能力较低的设备上完美执行很长一段时间 然后有一天在某些内核中默默地失败 我花了半天时间追寻一个难以捉摸的错误 结果发现构建规则已经sm 21而该设备 Tesla C2050 是2 0 是否有任何
  • cudaMemcpyToSymbol 与 cudaMemcpy [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图找出
  • 在新线程中调用支持 CUDA 的库

    我编写了一些代码并将其放入它自己的库中 该库使用 CUDA 在 GPU 上进行一些处理 我正在使用 Qt 构建 GUI 前端 作为加载 GUI 的一部分 我调用 CUresult res CUdevice dev CUcontext ctx
  • 用于类型比较的 Boost 静态断言

    以下问题给我编译器错误 我不知道如何正确编写它 struct FalseType enum value false struct TrueType enum value true template
  • 寻找 CUDA 中的最大值

    我正在尝试在 CUDA 中编写代码来查找最大值 对于给定的一组数字 假设您有 20 个数字 并且内核在 2 个块 每块 5 个线程 上运行 现在假设 10 个线程同时比较前 10 个值 并且thread 2找到最大值 因此线程 2 正在更新
  • CUDA素数生成

    当数据大小增加超过 260k 时 我的 CUDA 程序停止工作 它不打印任何内容 有人能告诉我为什么会发生这种情况吗 这是我的第一个 CUDA 程序 如果我想要更大的素数 如何在 CUDA 上使用大于 long long int 的数据类型
  • cuda 共享内存 - 结果不一致

    我正在尝试并行缩减以对 CUDA 中的数组求和 目前我传递一个数组来存储每个块中元素的总和 这是我的代码 include
  • 传递给 CUDA 的结构中的指针

    我已经搞砸了一段时间了 但似乎无法正确处理 我正在尝试将包含数组的对象复制到 CUDA 设备内存中 然后再复制回来 但当我遇到它时我会跨过那座桥 struct MyData float data int dataLen void copyT
  • CUDA Thrust 和 sort_by_key

    我正在寻找 CUDA 上的排序算法 它可以对元素数组 A 双精度 进行排序 并返回该数组 A 的键 B 数组 我知道sort by keyThrust 库中的函数 但我希望元素数组 A 保持不变 我能做些什么 我的代码是 void sort
  • CUDA线程执行顺序

    我有一个 CUDA 程序的以下代码 include
  • CUDA 估计 2D 网格数据的每块线程数和块数

    首先我要说的是 我已经仔细阅读了所有类似的问题 确定每个块的线程和每个网格的块 https stackoverflow com questions 4391162 cuda determining threads per block blo

随机推荐

  • supervisor系列:3、配置文件

    supervisor系列 3 配置文件 文章目录 supervisor系列 3 配置文件 1 文件格式 1 1 环境变量 2 unix http server 段设置 2 1 unix http server 段的值 2 2 unix ht
  • VS中Qt中ui文件和生成.h文件问题

    vs中的ui的ui xxxx h头文件是由Qt通过编译生成 vs项目属性中配置环境调用Qt安装目录下bin目录下的uic exe来自动生成代码 如果移动工程目录 而之前又把相关的ui xxx h头文件添加到工程或移动其位置 那么再次修改ui
  • sketchup 255个su常用插件)_「教程」巧用Rhino和SU,做出你想要的地形效果

    Xiao素材 地形建模教程 本期精选 教你如何做好地形效果图 1 SU部分 地形效果 SU插件安装小教程 su软件是我们现在经常会使用到的一个软件 但是在我们作图的过程中会发现 很多情况下 相对于一些复杂的图形我们需要依赖相关的插件 比如
  • python递归函数代码_Python递归函数 二分查找算法实现解析

    一 初始递归 递归函数 在一个函数里在调用这个函数本身 递归的最大深度 998 正如你们刚刚看到的 递归函数如果不受到外力的阻止会一直执行下去 但是我们之前已经说过关于函数调用的问题 每一次函数调用都会产生一个属于它自己的名称空间 如果一直
  • Kubernetes + Dashboard 集群搭建

    1 环境说明 基于kubeadm工具部署k8s 集群 还有基于二进制的部署方式但是需要单独部署k8s的每个组件比较繁琐 kubeadm是 Kubernetes官 提供的 于快速部署Kubernetes集群的 具 基于Kubernetes v
  • OC中的分类与类扩展

    在OC中 对于已有的类进行扩展 我们有两种方式 1 在原始类的定义中 进行代码扩展 2 通过继承的方式 扩展子类 3 使用分类的方式 第一 二种方式不用多说 第三种方式则是OC中比较有特色的功能 分类允许我们在不更改类的原始代码的情况下 实
  • 接口设计之幂等性设计

    幂等性设计 今天我们来聊聊接口的幂等性设计 所谓幂等 就是任意多次执行所产生的影响均与一次执行的影响相同 幂等性接口是指可以使用相同参数重复执行 并能获得相同结果的接口 这里就不展开数学中的定义了 有兴趣的可以自行google 为什么接口需
  • 关于mysql_free_result和mysql_close的解惑

    之前用mysql的时候一直是在用短链接 调用mysql store result获取一次数据之后就直接调用 以下是代码片段 mysql free result m result mysql close m Database 但是有两个问题
  • 找个好用的录屏软件,怎么这么难?

    真的要被录屏软件给搞疯了 本来公司说要给新人做个培训视频 想着把视频录屏一下 然后简单的剪辑一下就可以了 可谁知道录屏软件坑这么多 弄来弄去头都秃了 不过在头秃了几天之后 终于让我发现了一个值得 私藏 的录屏软件 咱就说这是什么神仙软件 把
  • 编码器测速,获取实际速度

    本例程中使用的电机为带霍尔编码器的减速电机 电机由三部分组成 减速器 电机以及霍尔编码器 霍尔编码器工作原理 霍尔编码器通过电磁转换 将机械的位移转化为脉冲信号 并且输出A B两相的方波信号 A B两相脉冲信号相位相差90 通过检测规定时间
  • Android Studio快捷键从Mac OS改为Win

    原理将Mac的Control映射为Command Command映射为Option Option映射为control 这样与win的快捷键按键习惯应该相同 未长时间测试
  • iOS App上传到苹果应用市场构建版本的图文教程

    使用hbuilderx的h5 或uniapp框架写的前端 进行云打包ios应用 会生成一个ipa后缀的应用文件 这个文件是没有办法像安卓应用那样直接安装在手机上面的 需要上架到苹果应用商店 用户才能下载安装使用 因此 我们这篇文章讲详细介绍
  • 5G基础信令

    一 4 5G高层协议规范框架对比 4G 5G 36 300 LTE整体 38 300 NR整体 36 401 E URTAN整体架构 38 401 NG RAN整体架构 36 321 LTE MAC 38 321 NR MAC 36 322
  • Dockerfile部署mysql并初始化

    文件目录结构 Dockerfile FROM centos 7 ADD jdk 8u261 linux x64 tar gz usr local ADD check mysql sh home datasong release bin CO
  • Gogs使用详解

    Gogs使用介绍 Gogs是一款类似Github 国内有码市 的开源文件 代码管理系统 基于Git 目前功能基本介绍 远程代码仓库管理 代码仓库权限分配 管理 团队管理 代码审查 1 注册 2 基本功能介绍 主面板说明 图中 表示自己个人账
  • 【测试入门】测试用例经典设计方法 —— 因果图法

    01 因果图设计测试用例的步骤 1 分析需求 阅读需求文档 如果User Case很复杂 尽量将它分解成若干个简单的部分 这样做的好处是 不必在一次处理过程中考虑所有的原因 没有固定的流程说明究竟分解到何种程度才算简单 需要测试人员根据自己
  • 直线检测方法—LSD论文翻译

    附原文链接 LSD a Line Segment Detector 摘 要 LSD是一个线段检测器 能够在线性时间内得到亚像素级精度的检测结果 它无需调试参数就可以适用于任何数字图像上 并且能够自我控制错误数量的检测 平均来说 一个图像中允
  • Bazel install Tips

    Bazel Fast Correct Choose two Build and test software of any size quickly and reliably Speed up your builds and tests Ba
  • Android接口一般定义格式,Android开发规范

    原标题 Android开发规范 一 书写规范 1 编码方式统一用UTF 8 2 花括号不要单独一行 和它前面的代码同一行 而且 花括号与前面的代码之间用一个空格隔开 3 空格的使用 if else for switch while等逻辑关键
  • 一个不错的关于CPU和GPU(CUDA)的性能比较讨论话题

    http topic csdn net u 20081027 23 67ff3857 3c71 4d5c acf6 095f3497c7a9 html这里是今天的一个论坛的一个帖子 大家可以讨论一下 1 那些程序适合用cpu来做 那些适合用