CUDA入门(一)

2023-05-16

最近我也都在看CUDA,自己看书和练习也都搞了一个月了。而且经常在CSDN上逛,也发现了很多问题,所以决定自己写点这方面的东西,方便自己也方便后来人。

根据我的调查,我发现现在的初学者大都是非计算机专业的,都是一些行业内部的人士,比如地震勘探,生物学,流体力学和气象等等这些应用领域的人在学,像我们这种计算机专业在学的还比较少。这些人大都呢都是有C语言基础,但是编程经验方面却比较欠缺(也有不少高手,高手们不要扔砖哈),所以难免被一些小的错误和问题绊住,下面我就简单的说一下我的经验。

大家都知道,CUDA C不是一门新语言,它基于C,只不过扩充了一些东西而已。所以,无论如何,建议在看CUDA之前,先回顾一下C语言,多看看没有坏处,CUDA的书很多都没有说语法的,因为他们都有一个前提——假设读者有一定的C语言基础!看C语言的时候,如果能动手练练那当然更好了。编程不能光看不练。

关于看书方面,目前有好几本书都还是不错的。我哟如下建议,第一本你还是看《GPU高性能编程 CUDA实战》,翻译版的,黑色封面加魔方(其实是GPU线程模型),不贵,原价39.00国币。这本书好的地方就是:基础。作者从最简单的C语言程序入门,循序渐进教你如何一步一步的编CUDA程序。这对新手来说相当重要,入门是关键,“师傅领进门,修行看个人”。

Okay,现在你懂一点了,建议看第二本书,这个可以不叫书,它是英伟达出的一个《CUDA编程指南》,有好几个版本,而且 3.0以后的中文版都是风辰大哥翻译的——如果你水品高,不拦着你看英文原版。看这个有什么好处呢?毕竟这个是人家英伟达自己的东西,他很清楚自己的GPU是怎么回事,规矩是他定的,你最好看看,他的规矩是什么。

第三本就是勇哥那本《GPU高性能运算之CUDA》,为什么现在才看这本书了——呵呵好东西总是后面才出场。它哪里好呢?——它讲了有一些深的东西:1、他讲了不少硬件架构的东西,这个比较难,而且你要看看理解,不容易的东西,我本人本科的时候就最怕硬件的东东呢。2、后面大篇幅的实例代码,有优化的,有大型的案例,这两个也是值得好好看和深究的。所以这些都是需要“基础”和“时间”来好好看的。

第四本,这个可以选择不看,看个人情况了。就是胡文美(Wen-mei W. Hwu)的《大规模并行处理器程序设计》,是影印版的,影印版就是复印版的意思,也即是英文版。胡和David B.Kirk也可以说是英伟达制定规则的参与者,这本书也讲得很细致,有深有浅——由于本人读的也是一般般,所以关于这本书不多说。吐舌头

如果你能坚持看完这几本书(至少前三本),并且能动手做做练习的话,估计你不会有那么多的困惑了。当然很多时候你需要花时间来思考,思考你看到的,你练习的,多问问为什么?——这点我也做的不够好,自我批评下。

另外还有一个问题,就是关于编程,很多人都说,我不是计算机专业的,对编程我不懂,能给我详细说说这个,说说那个么?这一点,我在上大一或者大二的时候也这么说过,可以理解的,但是慢慢你们就会发现,很多时候,很多东西,别人不可能教你,也教不会你。需要你自己去学。IDE 需要自己去摸索,多看帮助文档,不会就去ask 搜索引擎,你的问题我相信很多人都遇到过的,这就是网络时代的好处。还有经验型的东西要多总结:这些错误,一般是什么原因,遇到多了就大概都能猜个80%——别人的经验也可以拿来当自己的用的。

总结一下,我也唠唠叨叨说了一大堆,就两个观点:关于看书和关于编程。希望对新手有个帮助,CUDA出的时间不长,前面的路还很远,希望和大家一起学习。如果哟什么不对的地方,欢迎批评指正,我也是新手来的。



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

CUDA入门(一) 的相关文章

  • __syncthreads() 死锁

    如果只有部分线程执行 syncthreads 会导致死锁吗 我有一个这样的内核 global void Kernel int N int a if threadIdx x
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • cuda中内核的并行执行

    可以说我有三个全局数组 它们已使用 cudaMemcpy 复制到 GPU 中 但 c 中的这些全局数组尚未使用 cudaHostAlloc 分配 以便分配页面锁定的内存 而不是简单的全局分配 int a 100 b 100 c 100 cu
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 内联 PTX 汇编代码强大吗?

    我看到一些代码示例 人们在 C 代码中使用内联 PTX 汇编代码 CUDA工具包中的文档提到PTX很强大 为什么会这样呢 如果我们在 C 代码中使用这样的代码 我们会得到什么好处 内联 PTX 使您可以访问未通过 CUDA 内在函数公开的指
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 具有 Cuda Thrust 的多个 GPU?

    如何将 Thrust 与多个 GPU 一起使用 这只是使用 cudaSetDevice deviceId 的问题吗 然后运行相关的 Thrust 代码 使用 CUDA 4 0 或更高版本 cudaSetDevice deviceId 接下来
  • 有条件减少 CUDA

    我需要总结一下100000值存储在数组中 但带有条件 有没有办法在 CUDA 中做到这一点以快速产生结果 任何人都可以发布一个小代码来做到这一点吗 我认为 要执行条件约简 您可以直接将条件引入为乘法0 假 或1 真 加数 换句话说 假设您希
  • cudaDeviceScheduleBlockingSync 和 cudaDeviceScheduleYield 之间有什么区别?

    正如这里所说 如何减少 CUDA 同步延迟 延迟 https stackoverflow com questions 11953722 how to reduce cuda synchronize latency delay 等待设备结果有
  • Bank 在字长方面存在冲突

    我读过一些关于共享内存的好文章 但我对银行冲突有初步疑问 据说 如果线程 1 和线程 2 从存储体 0 访问字 0 则不存在存储体冲突 但如果他们访问不同的单词 就会出现银行冲突 但我的问题是不同的单词如何可以驻留在一个银行中 由于bank
  • 为什么 cuCtxCreate 返回旧上下文?

    我已经安装了 CUDA SDK 4 2 64 CUDA工具包4 2 64 CUDA 驱动程序 4 2 64 我检查了 windows 中的每个 nvcuda dll 所有这些都是 4 2 版本 但是当我使用驱动程序 api 创建上下文并使用
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • CUDA计算能力2.0。全局内存访问模式

    CUDA 计算能力 2 0 Fermi 全局内存访问通过 768 KB L2 缓存进行 看起来 开发人员不再关心全局内存库 但全局内存仍然非常慢 因此正确的访问模式很重要 现在的重点是尽可能多地使用 重用 L2 我的问题是 如何 我将感谢一
  • 设备内存刷新cuda

    我正在运行一个 C 程序 其中调用了两次 cuda 主机函数 我想清理这两个调用之间的设备内存 有没有办法可以刷新 GPU 设备内存 我使用的是计算能力为2 0的Tesla M2050 如果你只想将内存归零 那么cudaMemset可能是最
  • CUDA 模型 - 什么是扭曲尺寸?

    最大工作组大小和扭曲大小之间有什么关系 假设我的设备有 240 个 CUDA 流处理器 SP 并返回以下信息 CL DEVICE MAX COMPUTE UNITS 30 CL DEVICE MAX WORK ITEM SIZES 512
  • GPU上动态分配内存

    是否可以在内核内的 GPU 全局内存上动态分配内存 我不知道我的答案有多大 因此我需要一种方法为答案的每个部分分配内存 CUDA 4 0 允许我们使用 RAM 这是一个好主意还是会降低速度 可以在内核中使用 malloc 检查以下内容 摘自
  • CUDA-Kernel 应该根据块大小动态崩溃

    我想做稀疏矩阵 密集向量乘法 假设用于压缩矩阵中条目的唯一存储格式是压缩行存储 CRS 我的内核如下所示 global void krnlSpMVmul1 float data mat int num nonzeroes unsigned
  • 为什么使用 boost::none 无法通过 nvcc 编译?

    我正在尝试编译以下代码 include
  • goto 指令对 CUDA 代码中扭曲内发散的影响

    对于CUDA中简单的warp内线程发散 我所知道的是SM选择一个重新收敛点 PC地址 并在两个 多个路径中执行指令 同时禁用未采用该路径的线程的执行效果 例如 在下面的代码中 if threadIdx x lt 16 A do someth

随机推荐

  • Android启动模式之singleinstance的坑

    Android启动模式之singleinstance的坑 前言 在实际应用中 xff0c 使用singleinstance启动模式时 xff0c 会遇到一些奇奇怪怪的问题 Android有四种启动模式 xff0c 分别是standard x
  • 关于使用iconfont图标总生成小长方形框的解决办法

    起因是在联系仿写网易的静态页面的时候 xff0c 使用iconfont小图标的时候 xff0c 引入正确 xff0c 但是在页面上一直显示的是一个长方形小框的页面 各种搜索终于找到了解决办法 主要原因是由于iconfont css中路径不对
  • Qt和MFC的效率对比

    Qt和MFC的效率对比 之前一直做mfc xff0c 昨天看了一晚上的Qt xff0c 瞬间就喜欢上它了 xff0c Qt在windows下应该没有mfc的运行效率高 xff0c 但是我想知道差多少 xff0c 不知有没有大牛做过这方面的对
  • android 移植

    from http wiki kldp org wiki php AndroidPortingOnRealTarget s 6 1 Contents 1 Introduction 2 Copyright and Acknowledgemen
  • LD3320语音识别模块+JQ8900-TF语音模块实现简单的语音交互控制

    玩这个真的要感谢头条的强大推荐 xff0c 清明节回家的大巴车上 xff0c 无聊的刷着头条 xff0c 很智能的给我推荐了一款语音识别模块 xff0c 一直很想自己试着玩一把的我 xff0c 按奈不住 xff0c 点开视频看到了介绍 xf
  • 智能配网方案 Airkiss 技术原理介绍及应用

    写在前面 站在巨人的肩膀上 xff0c 可以看得更远 一 什么是Air Kiss 可以说AirKiss 是微信硬件平台提供的一种WIFI硬件设备快速配置连接网络的技术 xff0c 是一种创新性的信息传递技术 通过该技术可以便捷的向一台具有W
  • 谈谈Android 安全策略SElinux

    不积跬步无以至千里 xff0c 补全自己的短板 xff0c 完善体系 xff0c 站在巨人的肩膀上 xff0c 看到的更远 xff0c 写这篇文章也算是对这个知识点的总结 一 xff0c 背景 SElinux出现之前 xff0c Linux
  • AOSP添加新硬件设备开发-HAL层

    此篇文章接上一篇hidl 我们来实现hal层 hal层官方解释系统硬件抽象层 xff0c 理解为kernel的代理层 xff0c 他的存在屏蔽了不同硬件设备的差异 xff0c 根据提供的访问标准 xff0c 就可以对不同的硬件进行操作 xf
  • 解决 Windows has triggered a breakpoint in Linkage.exe问题

    这两天在做一个小项目 xff0c 里面有多线程的东东 xff0c 在调试的时候 总是遇到 Windows has triggered a breakpoint in Linkage exe 的错误 现在将这个问题和大家分享一下 前提是这样的
  • android rc文件的启动

    记录hostapd 启动方式 xff0c 多种方式可以启动一个bin hostapd android rc init rc fragment for hostapd on Android Copyright c 2002 2016 Joun
  • MTK WLAN支持多种NVRAM方案

    背景 硬件差异的前提 wifi功率会有差异 软件上可以做功率补偿方案 但是需要知道整机状态 然后设定一个flag 软件根据flag 选择使用预制的多NVRAM 简单点来说就是 根据不同条件 加载不同的NVRAM 实现原理 1 根据不同的射频
  • C51矩阵键盘

    对于键盘按键之前也是似懂非懂 xff0c 手里有一块浩豚电子的51板子 xff0c 现在跟着使用说明看一遍学习 矩阵键盘 xff0c 称为行列键盘 xff0c 在单片机上使用4条I O口作为行线 xff0c 4条I O口作为列线 xff0c
  • Ubuntu 获取 root 权限 (临时&永久)

    xfeff xfeff xfeff xfeff Ubuntu 获取 root 权限 操作环境 xff1a Win7 43 VMware Workstation 12 0 1 43 Ubuntu 12 04 1 临时获取 root 权限 xf
  • 广播Boradcast socket sendto出错 errno: 101 Network is unreachable

    关键字 xff1a linux 广播 255 255 255 255 sendto error Network is unreachable 全网广播 场景 xff1a 今天调试linux 网络编程的广播 xff0c 当向255 255 2
  • ubuntu下查看某个包是否已安装

    dpkg l dpkg l grep package name dpkg status package name 查看 var lib dpkg status 内容
  • 查看一个可执行文件或者库的依赖库

    经常需要查看一个可执行文件或者库依赖那些库文件 通常情况下这很好办 xff0c 使用ldd命令就可以了 xff0c 比如 xff1a 1 2 3 4 5 6 ldd bin bash linux vdso so 1 61 gt 0x0000
  • 构建gcc交叉编译工具链

    如何构建一个GCC 交叉编译工具链 GCC不仅是一个编译器 xff0c 它是一个开源工程 xff0c 可以让你建立各种编译器 一些编译器支持多线程 xff0c 一些支持共享库 xff0c 一些支持 Multilib xff08 典型的应用是
  • buildroot VS yocto

    翻译自Buildroot vs OpenEmbedded or Yocto Project A Four Hands Discussion 2016 pdf Buildroot 和 yocto的对比 对比内容 xff1a xff08 1 x
  • git查看各个branch之间的关系图

    提供两种方法 xff1a 1 使用git log命令 git log graph decorate oneline simplify by decoration all 说明 xff1a decorate 标记会让git log显示每个co
  • CUDA入门(一)

    最近我也都在看CUDA xff0c 自己看书和练习也都搞了一个月了 而且经常在CSDN上逛 xff0c 也发现了很多问题 xff0c 所以决定自己写点这方面的东西 xff0c 方便自己也方便后来人 根据我的调查 xff0c 我发现现在的初学