CUDA如何获取网格、块、线程大小以及并行化非方阵计算

2024-01-21

我是 CUDA 新手,需要帮助理解一些事情。我需要帮助并行化这两个 for 循环。具体来说,如何设置dimBlock 和dimGrid 以使运行速度更快。我知道这看起来像 sdk 中的向量相加示例,但该示例仅适用于方阵,当我尝试修改 128 x 1024 矩阵的代码时,它无法正常工作。

__global__ void mAdd(float* A, float* B, float* C)
{
    for(int i = 0; i < 128; i++)
    {
        for(int j = 0; j < 1024; j++)
        {
            C[i * 1024 + j] = A[i * 1024 + j] + B[i * 1024 + j];
        }
    }
}

这段代码是一个更大循环的一部分,也是代码中最简单的部分,所以我决定尝试并行化 thia,同时学习 CUDA。我已阅读指南,但仍然不明白如何获得正确的号码。网格/块/线程的运行并有效地使用它们。


正如您所写的,该内核是完全串行的。启动执行它的每个线程都将执行相同的工作。

CUDA(以及 OpenCL 和其他类似的“单程序、多数据”类型编程模型)背后的主要思想是采用“数据并行”操作 - 因此必须多次执行相同的、很大程度上独立的操作 - 并且编写一个执行该操作的内核。然后启动大量(半)自治线程来跨输入数据集执行该操作。

在数组加法示例中,数据并行操作是

C[k] = A[k] + B[k];

对于 0 到 128 * 1024 之间的所有 k。每个加法操作完全独立,没有顺序要求,因此可以由不同的线程执行。为了在 CUDA 中表达这一点,可以这样编写内核:

__global__ void mAdd(float* A, float* B, float* C, int n)
{
    int k = threadIdx.x + blockIdx.x * blockDim.x;

    if (k < n)
        C[k] = A[k] + B[k];
}

[免责声明:代码在浏览器中编写,未经测试,使用风险自负]

在这里,串行代码中的内部和外部循环被每个操作一个 CUDA 线程取代,并且我在代码中添加了限制检查,以便在启动的线程多于所需操作的情况下,不会发生缓冲区溢出。如果内核是这样启动的:

const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / blocksize; // value determine by block size and total work

madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);

然后,256 个块(每个块包含 512 个线程)将被启动到 GPU 硬件上,以并行执行数组加法操作。请注意,如果输入数据大小无法表示为块大小的整数倍,则需要对块数进行舍入以覆盖完整的输入数据集。

以上所有内容都是针对非常琐碎的操作的 CUDA 范式的极大简化的概述,但也许它为您提供了足够的洞察力,让您可以继续自己的工作。如今 CUDA 已经相当成熟,网络上有很多优质的免费教育材料,您可以使用它来进一步阐明我在这个答案中掩盖的编程模型的许多方面。

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

CUDA如何获取网格、块、线程大小以及并行化非方阵计算 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • Django的bulk_create函数示例

    我试图理解 Django 中的bulk create 这是我试图转换的原始查询 for e in q msg Message objects create recipient number e mobile content batch co
  • 如何更改 TreeView 节点高度,在节点中绘制 3 条线

    我将 D7 与 TreeView 不是 VirtualTreeView 一起使用 如何更改节点高度以使用 OwnerDraw 并在节点矩形中绘制 3 或 5 或更多 行 文本 所以树应该看起来像这样 显示根节点 2 个节点 aaa 和 bb
  • 使用 PM2 运行自定义 npm 脚本

    我目前正在开发几个 Telegram 机器人 但我想将它们全部保存在同一个 git 存储库中 问题是 另一方面 我想将它们作为单独的进程运行 由于我使用的是 Telegraf 框架 因此要运行机器人 请执行以下操作 micro bot sr
  • 如何在容器内保存对不同元素的多个引用?

    考虑这个简单的例子 v Vec
  • mailchimp api 2.0通过php订阅?

    我需要一个如何通过电子邮件地址订阅 mailchimp 时事通讯的示例 请在此处查看新的 api 链接 https bitbucket org mailchimp mailchimp api php https bitbucket org
  • 两种使用局部敏感哈希查找最近邻居的算法,哪一种?

    目前我正在研究如何使用局部敏感哈希来查找最近邻居 然而 当我阅读论文和搜索网络时 我发现了两种执行此操作的算法 1 使用L个哈希表和L个随机LSH函数 从而增加两个相似文档获得相同签名的机会 例如 如果两个文档的相似度为 80 那么它们有
  • 如何将 ImageView 与底部对齐,填充其宽度和高度,并保持其长宽比?

    背景 ImageView 有各种 XML 属性来缩放其内容 以及各种允许放置视图并设置其大小的布局视图 但是 我无法弄清楚如何在某些情况下很好地缩放 imageView 一个例子是将 ImageView 放在底部 例如 frameLayou
  • 通过Java编程语言读取android中的/dev/input/event

    我想记录 Android 手机上完成的所有输入事件 将其保存在某个文件中 然后使用该文件查看用户输入在什么时间发生 AFAIK 我应该调用 dev input event 获取输入事件 请指导我如何通过 Android 活动执行相同的操作
  • 迭代 String Swift 2.0

    我正在尝试在 Swift 游乐场中编写一段非常简单的代码 var word Zebra for i in word print i 但是 我总是在第 3 行收到错误 String 没有名为 Generator 的成员 关于为什么这行不通的任
  • 如何在 TH 表标签中使用 CSS Rotate()

    我需要 CSS 专家的帮助 我正在尝试创建一个简单的 html table 其中列标题 th 标签 的文本旋转 270 度以横向显示 我在锚定标题单元格时遇到问题 因此单元格文本的最左侧部分单独与所有单元格的底部或基线对齐 th tags
  • 响应式地包裹和展开 div

    我有一组 6 个 DIV 我想根据浏览器的屏幕宽度将它们每 X 个 div 包装在一个新的 div 中 所以首先我有 div class blogItem div div class blogItem div div class blogI
  • Android VpnService - 如何检查 VpnService 是否已启动?

    我有两个使用 VpnService 类的应用程序 但同时只能有一个 VPN 连接运行 创建新接口时 现有接口将被停用 我希望新应用程序不要启动 vpnservice 以避免旧接口及其 VPN 连接被停用 所以我想在调用 startServi
  • Java POI 找不到符号 WorkbookFactory

    我正在将 HSSF 模型转换为 XSSF 我到处都会遇到一些小错误 我下载了最新的 POI 并将所有 jar 文件放入其中 并将 apache 包含在我的 java 类中 出现此错误 import org apache poi ss use
  • 当JWT过期时,本地存储中存储的JWT会自动删除吗?

    我已将 JWT 存储在用户浏览器的本地存储中 我已使用 nodejs express 将 JWT 的到期日期设置为 7 天 浏览器会检测到过期日期并自动将其从本地存储中删除吗 或者我的服务器是否必须检查 JWT 并从用户浏览器的本地存储中删
  • 在 R 中使用 rvest 抓取链接时出现空节点

    我的目标是获得 Kaggle 的所有挑战及其标题的链接 我正在使用 rvest 库 但我似乎还没有走多远 当我有几个 div 时 节点是空的 我一开始就尝试在第一个挑战中做到这一点 并且应该能够将其转移到之后的每个条目中 第一个条目的 xp
  • xquery-获取单个父元素中不为空的元素的计数

    请考虑以下 XML div p Text sihdfaif p p p p Text sihdfaif p p p p Text sihdfaif p p Text sihdfaif p p Text sihdfaif p div 现在 我
  • NewLine 转义字符不起作用

    我们知道 n 在 JavaScript 中用于换行 我应该如何将它用于输出 在 for 循环中 str prompt Enter any string for i 0 i
  • NSFileManager 列出不包括目录的目录内容

    有没有办法告诉 NSFileManager contentsOfDirectoryAtURL includingPropertiesForKeys options error 收集目录内容时排除目录名称的方法 我有一个显示文件夹的树视图 并
  • SQLite (3.7.17) 版本太旧。 Active Record 支持 SQLite >= 3.8

    我尝试在 EC2 实例中运行 Rails 6 但遇到以下错误 Your version of SQLite 3 7 17 is too old Active Record supports SQLite gt 3 8 如果重要的话 我的 g
  • CUDA如何获取网格、块、线程大小以及并行化非方阵计算

    我是 CUDA 新手 需要帮助理解一些事情 我需要帮助并行化这两个 for 循环 具体来说 如何设置dimBlock 和dimGrid 以使运行速度更快 我知道这看起来像 sdk 中的向量相加示例 但该示例仅适用于方阵 当我尝试修改 128