为什么改变块和网格大小会对运行时间产生如此大的影响?

2023-12-01

我正在研究一些cudatutorial将 RGBA 图片转换为灰度图。 但我不明白为什么要改变blockSize and gridSize改进了 X33 时间。

__global__
void rgba_to_greyscale(const uchar4* const rgbaImage,
                       unsigned char* const greyImage,
                       int numRows, int numCols)
{
    int i = blockIdx.x*numCols + threadIdx.x;
    float channelSum = .299f * rgbaImage[i].x + .587f * rgbaImage[i].y + .114f * rgbaImage[i].z;
    greyImage[i]= channelSum;
}

void your_rgba_to_greyscale(const uchar4 * const h_rgbaImage, uchar4 * const d_rgbaImage,
                            unsigned char* const d_greyImage, size_t numRows, size_t numCols)
{
  const dim3 blockSize(numCols, 1, 1);
  const dim3 gridSize(numRows, 1 , 1);
  rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);

  cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError());
}

当我按上面设置时:

const dim3 blockSize(numCols, 1, 1);
const dim3 gridSize(numRows, 1 , 1);

I get Your code executed in 0.030304 ms

当我设置时:

 const dim3 blockSize(1, 1, 1);
 const dim3 gridSize(numRows, numCols , 1);

并更新线程函数以使用新索引:

int i = blockIdx.x*numCols + blockIdx.y;

I get Your code executed in 0.995456 ms.

  1. 我希望它是相反的,因为 GPU 可以计算所有 第二次网格分割时单独的像素是否与 缓存一致性问题?为什么我会得到这些结果?
  2. 从理论上来说,这个问题的最佳网格和块大小是多少?是否可以在运行时计算它?

FYI:

numRows = 313 numCols =557 

技术性能:

#uname -a && /usr/bin/nvidia-settings -v
    Linux ip-10-16-23-92 3.2.0-39-virtual #62-Ubuntu SMP Thu Feb 28 00:48:27 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

    nvidia-settings:  version 304.54  (buildmeister@swio-display-x86-rhel47-11)

不推荐使用网格/块配置。第一个是不可扩展的,因为 GPU 的每个块的线程数是有限的,因此它最终会因较大的图像尺寸而失败。第二种是一个糟糕的选择,因为每个块只有 1 个线程,不推荐这样做,因为 GPU 占用率会很低。您可以通过以下方式验证GPU 占用计算器包含在 CUDA 工具包中。建议的块大小应为 GPU 扭曲大小(16 或 32)的倍数,具体取决于 GPU。

在您的情况下,针对 2D 网格和块大小的通用且可扩展的方法将如下所示:

const dim3 blockSize(16, 16, 1);
const dim3 gridSize((numCols + blockSize.x - 1)/blockSize.x, (numRows + blockSize.y - 1)/blockSize.y , 1);

您可以将块大小从 16 x 16 更改为您喜欢的任何大小,前提是不超出设备的限制。对于计算能力 1.0 至 1.3 的设备,每块最多允许 512 个线程。对于计算能力 2.0 及以上的设备,此限制为每块 1024 个线程。

现在,网格和块是二维的,内核内部的索引将修改如下:

int i = blockIdx.x * blockDim.x + threadIdx.x; //Column
int j = blockIdx.y * blockDim.y + threadIdx.y; //Row

int idx = j * numCols + i;

//Don't forget to perform bound checks
if(i>=numCols || j>=numRows) return;

float channelSum = .299f * rgbaImage[idx].x + .587f * rgbaImage[idx].y + .114f *     rgbaImage[idx].z;
greyImage[idx]= channelSum;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么改变块和网格大小会对运行时间产生如此大的影响? 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • CUDA Thrust 的多 GPU 使用

    我想使用我的两张显卡通过 CUDA Thrust 进行计算 我有两张显卡 在单卡上运行对于两张卡都适用 即使我在 std vector 中存储两个 device vector 也是如此 如果我同时使用两张卡 循环中的第一个周期将起作用并且不
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 如何使用 C# 获取 GAC 的位置?

    我怎样才能得到的位置GAC目录使用C Windows 注册表中是否存在条目 UPDATE 我需要该位置 因为我想枚举和分析位于 GAC 中的程序集 Bye 如果您想枚举 GAC 中的内容 例如编写系统管理工具 您最好的选择是使用 fusio
  • 名称由单下划线分割的 ASP.NET Core 选项模式

    我正在尝试使用 ASP NET Core 选项模式加载我的应用程序设置 The appsettings json包含 TEst hello TEST ABC 2 POCO类 public class AppSetting public st
  • li:将鼠标悬停在访问过的颜色上

    在我的 li 元素中 我有一个链接和一个跨度中包含的一些文本 当我将鼠标悬停在 li 上时 我想更改文本和链接的颜色 这效果很好 但是我正在努力设置访问的颜色并保留此功能 这是我的代码 HTML ul class tour 1 li spa
  • 为什么不能在 for 循环内操作“i”[重复]

    这个问题在这里已经有答案了 为什么 for i in range 10 i 1 print i return 1 2 3 4 5 6 7 8 9 10 代替 2 4 6 8 10 如果需要更多细节 这里将提供一些细节 for i in ra
  • php scandir 产生额外的元素(2 个点)

    Hi 我在名为 content 的目录中有以下文件 index php page1 php page2 php 和 page3 php 然后我有这个代码 column scandir content foreach column as va
  • 在VLOOKUP中动态更改源工作簿的文件路径

    我想要一个包含文件路径的单元格 C Documents Costs Costing 2017 xls Sheet2 A D 将用于VLOOKUP在工作簿其余部分的不同工作表中发挥作用 目前 我的文件路径位于名为 Master Sheet 的
  • 获取二进制文件 C 的哈希值

    我想获取我所知道的名称的二进制文件的哈希值 我尝试过以下方法 但后来意识到SHA1 返回字符串 文件名 的哈希值 但我想在文件本身上运行它 任何关于如何做到这一点的指示都会很棒 char fileName bin ls unsigned c
  • scalaz 中的类型类和继承

    这是我第二次尝试定义问题 我无法理解它 我希望能够定义一个代数类型并在其上定义一个简单的类型类 比方说Show 在哈斯克尔我做 data Tree a EmptyTree Node a deriving Show 现在 如果我输入Empty
  • 使用 Linq 从 IEnumerable 中提取数据并将其存储在数据表中

    我有一个如下所示的数据表 public static DataTable SetColumnHeaders DataTable KeyDataTable KeyDataTable Columns Add First Name typeof
  • 在内联 html img 标签中显示带有图像标签的 SVG

    为了将 SVG 转换为 PNG 我将 svg insideHTML 内容放入 img 标签中 如下所示 img src gt SVG 图片无法正确显示 尤其是 SVG 标签内的图片 如下所示 其他 svg 标签正确显示
  • 尝试为文件 附加自动命名数据库失败。存在同名数据库

    我的项目的 App Data 文件夹中有 ASPNETDB MDF 数据库 当我尝试添加用户时出现错误 MembershipUser user Membership CreateUser viewModel Username viewMod
  • MVC2 RTM - 使用实体框架模型绑定复杂对象

    我是 MVC 新手 并且真的很挣扎于我认为这应该是一个非常常见的场景 我正在使用 MVC2 RTM 和模型对象的实体框架 我正在做的工作 包含子对象集合的父对象的编辑视图 该表单显示父对象的所有可编辑字段 并迭代并显示所有关联子对象的所有可
  • Wordpress - 无需插件即可按视图获取 5 个热门帖子

    Hi 我有自定义字段 其中包含帖子中的图像 并且我想显示按视图排序的前 5 个帖子 我正在使用 WordPress 您能帮我吗 对不起 我的英语不好 Thanks 有一个错误Xhynk的参考 它运行的查询按字母顺序返回帖子 1 2 20 2
  • Postgres - 使用 postgis 计算距离

    经过几天的寻找 并尝试了我找到的所有内容后 我来这里询问如何使用 PostGis 计算 Postgres 上两点之间的距离 我有一张名为 位置 的表 该表有一个点类型的 坐标 列 当用户在应用程序上插入值时 我需要获取按近距离排序的位置 我
  • 从对象字典创建 Django 表单

    我觉得这一定很简单 但经过几天的尝试 我正式一无所知 我有一个字典 其中键是对象 值是对象列表 以下是我想如何使用该信息来构建表单 for object in dictionary name of field object slug nam
  • 如何从 iPad 键盘上删除或禁用特定文本字段的语言首选项键

    1 需要从 iPad 键盘上删除或禁用特定文本字段的按键 如图所示 设置在故事板中 或手动 textField setKeyboardType UIKeyboardTypeASCIICapable
  • 使用 PHP 重写 URL

    我有一个如下所示的网址 url com picture php id 51 我该如何将该 URL 转换为 picture php Some text goes here 51 我认为 WordPress 也有同样的作用 如何在 PHP 中创
  • 应用程序无法在 WAMP 上运行,但可以在在线服务器上运行

    我使用在线 SQLite 数据库制作了一个基本的登录应用程序 http demo3534535 16mb com 它在在线服务器上运行良好 现在我想在 Gennymotion 模拟器中使用 WAMP 在本地服务器上运行 我必须对代码进行哪些
  • 带有 where 子句的 SQL select 语句

    如果没有硬编码值 我将如何编写这个 sql 语句 resultSet statement executeQuery select from myDatabase myTable where name john this works 而是有类
  • 为什么改变块和网格大小会对运行时间产生如此大的影响?

    我正在研究一些cudatutorial将 RGBA 图片转换为灰度图 但我不明白为什么要改变blockSize and gridSize改进了 X33 时间 global void rgba to greyscale const uchar