我的代码中无效的“剥离/剩余”循环

2023-12-15

我有这个功能:

bool interpolate(const Mat &im, float ofsx, float ofsy, float a11, float a12, float a21, float a22, Mat &res)
{         
   bool ret = false;
   // input size (-1 for the safe bilinear interpolation)
   const int width = im.cols-1;
   const int height = im.rows-1;
   // output size
   const int halfWidth  = res.cols >> 1;
   const int halfHeight = res.rows >> 1;
   float *out = res.ptr<float>(0);
   const float *imptr  = im.ptr<float>(0);
   for (int j=-halfHeight; j<=halfHeight; ++j)
   {
      const float rx = ofsx + j * a12;
      const float ry = ofsy + j * a22;
      #pragma omp simd
      for(int i=-halfWidth; i<=halfWidth; ++i, out++)
      {
         float wx = rx + i * a11;
         float wy = ry + i * a21;
         const int x = (int) floor(wx);
         const int y = (int) floor(wy);
         if (x >= 0 && y >= 0 && x < width && y < height)
         {
            // compute weights
            wx -= x; wy -= y;
            int rowOffset = y*im.cols;
            int rowOffset1 = (y+1)*im.cols;
            // bilinear interpolation
            *out =
                (1.0f - wy) * ((1.0f - wx) * imptr[rowOffset+x]   + wx * imptr[rowOffset+x+1]) +
                (       wy) * ((1.0f - wx) * imptr[rowOffset1+x] + wx * imptr[rowOffset1+x+1]);
         } else {
            *out = 0;
            ret =  true; // touching boundary of the input            
         }
      }
   }
   return ret;
}

halfWidth非常随机:可以是 9、84、20、95、111...我只是想优化这段代码,我不太了解它的细节。

正如你所看到的,内在for已经矢量化,但 Intel Advisor 建议这样做:

enter image description here

这是 Trip Count 分析结果:

enter image description here

据我了解,这意味着:

  1. 向量长度为​​8,因此意味着每次循环可以同时处理8个浮点数。这意味着(如果我没记错的话)数据是 32 字节对齐的(尽管正如我所解释的here编译器似乎认为数据未对齐)。
  2. 平均而言,2 个周期是完全矢量化的,而 3 个周期是余数循环。最小值和最大值也是如此。不然我不明白什么; means.

现在我的问题是:我如何遵循英特尔顾问的第一个建议?它说“增加对象的大小并添加迭代,以便行程计数是向量长度的倍数”...好吧,所以它只是说“嘿伙计这样做”halfWidth*2+1(因为它来自-halfWidth to +halfWidth是 8 的倍数)”。但是我该怎么做呢?如果我添加随机循环,这显然会破坏算法!

我想到的唯一解决方案是添加“假”迭代,如下所示:

const int vectorLength = 8;
const int iterations = halfWidth*2+1;
const int remainder = iterations%vectorLength;

for(int i=0; i<loop+length-remainder; i++){
  //this iteration was not supposed to exist, skip it!
  if(i>halfWidth) 
     continue;
}

当然这段代码不会工作,因为它来自-halfWidth to halfWidth,但这是为了让你了解我的“假”迭代策略。

关于第二个选项(“增加静态和自动对象的大小,并使用编译器选项添加数据填充”)我不知道如何实现它。


首先,您必须检查 Vector Advisor 效率指标以及与 Loop Body 相比在 Loop Remainder 中花费的相对时间(请参阅 Advisor 中的热点列表)。如果效率接近 100%(或者在 Remainder 上花费的时间非常少),那么就不值得付出努力(正如 MSalters 在评论中提到的那样花钱)。

如果它#pragma循环计数 for 最典型的#iterations 值(取决于典型的半宽度值)。

如果 halfWIdth 是totally随机(没有共同值或平均值),那么您对此问题无能为力。

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

我的代码中无效的“剥离/剩余”循环 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • Spring 4 静态内容(如 css/js)带来错误 405 不支持请求方法“GET”

    我已经检查过这个问题 但是经过 4 个小时的尝试 没有任何结果对我有用 尝试访问我的 css 文件时收到 405 错误 这是我的 Config java package com myapp config import org springf
  • 如何确保我的 makefile 检测到头文件和 cpp 文件中的更改?

    目前 每当我这样做时make我的 makefile 告诉我 make some obj file o 是最新的 无论我是否编辑了生成该目标文件所涉及的任何文件 我如何让它检测变化 这是一个重现该问题的简单 makefile SHELL bi
  • C# 中的二维数组切片

    我正在寻找在 C 中切片二维数组 我有 double 2 2 价格 想要检索该数组的第二行 我尝试过价格 1 但我有一种感觉 可能是别的东西 提前致谢 没有直接的 切片 操作 但您可以定义如下扩展方法 public static IEnum
  • 扫描仪扫描文档(TIFF 和 PDF)的最佳设置[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 扫描仪的最佳设置是什么 以便扫描文档 白色和黑色文本 并将其用于 OCR 转换 以获得最佳结果 以及 PDF 和 TIFF 格式的标准设置和规范是什么 对于 OCR 最佳扫描设置是
  • Symfony2:未设置记住我令牌

    我按照需要做了一切 但我的 记住我 标记尚未设置 我跟踪代码直到 vendor symfony src Symfony Component Security Http RememberMe TokenBasedRememberMeServi
  • R 中的 ezANOVA 和pairwise.t.test:输出

    我一直在使用 R 运行 ezANOVA 然后进行成对比较 pairwise t test 运行后似乎不包含输出 所以我有以下与此相关的问题 是否有可能在 ezANOVA 中生成均方误差以进行重复测量 如果可以 如何生成 以及如何在pairw
  • 如何设置DataGrid中选定行的颜色

    DataGrid 中选定行的默认背景颜色太暗 我无法读取它 有没有办法覆盖它 试过这个
  • 在文件夹 blog 的同一域中安装 Wordpress 和 Laravel

    我在同一个domain com 上安装了laravel 该网站已启动并运行 我需要在domain com blog 的博客文件夹中安装wordpress 当我尝试安装 WordPress 时 它不允许我运行安装并显示 此网页有重定向循环 我
  • 带引号的注册表值

    我需要将一个值插入批处理文件中的注册表中 该值包含引号 这使得插入变得困难 set OPENCOMMAND JAVAHOME bin javaw exe jar 1 reg add HKEY LOCAL MACHINE SOFTWARE C
  • 如何对未知属性的数据进行建模?

    对需要查询但无法预先完全定义的数据进行建模的好方法是什么 例如 假设我想对有关以下内容的信息进行建模世界各国 每个国家都有一个人口 a flag和一个列表语言 这很容易 但是假设我们还想建模他们的国家棒球队的胜 负记录当然 并非所有国家都有
  • 使用列级标题过滤 Slickgrid 时如何执行部分匹配?

    当使用固定标题行实现列级过滤器时 如何返回部分匹配的单元格 IE 搜索词 omato 退货 自动机 番茄等 在示例中的 MyFilter 下替换此循环 for var columnId in columnFilters if columnI
  • 如何使用该目录的文件描述符在内核级别打开该目录?

    我正在开发一个项目 我必须打开一个目录并在内核级别读取其中的文件 目录 我基本上想找出如何ls是在内核级别实现的 现在我已经弄清楚如何使用以下命令获取目录的文件描述符sys open 和O DIRECTORY flag 但我不知道如何读取收
  • 在运行时用 Java 创建 n 维数组

    我有一个包含数组的字符串 例子 1 2 4 5 7 8 现在 我想用它制作一个实际的 Java 数组 我创建了一个函数来获取维度 并创建了一个递归函数来获取数组的每个元素 因此 我创建了每个一维数组 但我想知道Java中是否有一种方法可以创
  • 如何从子级向父级引用一个类?

    这可能听起来很愚蠢 但我如何在父级的另一个脚本中引用子级中的一个脚本中的类 我在谷歌上找不到任何东西 注意 我的脚本中有几个错误 这不是本文的重点 Public Private private Rigidbody myRigidbody p
  • android webview 中的 onClick 事件太慢

    我感觉 javascript 本身在 android webview 中相当快 但是触摸元素和触发 onclick 事件之间有很长的延迟 我可以想象 如果您在页面之间导航 这是一个功能 您首先看到元素上的突出显示 然后看到效果 导航 但对于
  • 从 http.Request 获取客户端 IP 地址的正确方法

    获取所有客户端 IP 地址的正确方法是什么http Request In PHP有很多的变量我应该检查一下 Go 上也一样吗 我发现的一项是 req RemoteAddr 请求是否区分大小写 例如x forwarded for是相同的X F
  • 在.NET 中解析 VB6 代码

    我有一个用 C 编写的 WPF 项目 为了获取有关外部依赖项的一些信息 我需要解析 VB6 脚本 脚本的位置发生了变化 其内容也发生了一些变化 但我感兴趣的主要代码将采用以下格式 Select Case Fields blah Value
  • 如何在 C# 中将 JSON 转换为 XML 或 XML 转换为 JSON?

    我开始使用 Json NET 将 JSON 格式的字符串转换为对象 反之亦然 我不确定在 Json NET 框架中 是否可以将 JSON 格式的字符串转换为 XML 格式 反之亦然 是的 使用 JsonConvert 类 其中包含用于此精确
  • 如何在ag网格透视模式下将不同的列数据显示为工具提示?

    var ColDef headerName colA field colA rowGroup true headerName colB field colB pivot true enablePivot true headerName co
  • 我的代码中无效的“剥离/剩余”循环

    我有这个功能 bool interpolate const Mat im float ofsx float ofsy float a11 float a12 float a21 float a22 Mat res bool ret fals