为什么 GCC 不自动矢量化这个循环?

2024-06-24

我正在尝试优化一个占用程序大量计算时间的循环。

但是,当我使用 -O3 -ffast-math -ftree-vectorizer-verbose=6 GCC 输出打开自动矢量化时,它无法对循环进行矢量化。

我正在使用海湾合作委员会4.4.5

代码:

/// Find the point in the path with the largest v parameter
void prediction::find_knife_edge(
    const float * __restrict__ const elevation_path,
    float * __restrict__ const diff_path,
    const float path_res,
    const unsigned a,
    const unsigned b,
    const float h_a,
    const float h_b,
    const float f,
    const float r_e,
) const
{
    float wavelength = (speed_of_light * 1e-6f) / f;

    float d_ab = path_res * static_cast<float>(b - a);

    for (unsigned n = a + 1; n <= b - 1; n++)
    {
        float d_an = path_res * static_cast<float>(n - a);
        float d_nb = path_res * static_cast<float>(b - n);

        float h = elevation_path[n] + (d_an * d_nb) / (2.0f * r_e) - (h_a * d_nb + h_b * d_an) / d_ab;
        float v = h * std::sqrt((2.0f * d_ab) / (wavelength * d_an * d_nb));

        diff_path[n] = v;
    }
}

来自海湾合作委员会的消息:

note: not vectorized: number of iterations cannot be computed.
note: not vectorized: unhandled data-ref 

在有关自动矢量化的页面上(http://gcc.gnu.org/projects/tree-ssa/vectorization.html http://gcc.gnu.org/projects/tree-ssa/vectorization.html)它声明它支持未知的循环边界。

如果我将 for 替换为

for (unsigned n = 0; n <= 100; n++)

然后对其进行矢量化。

我究竟做错了什么?

缺乏关于这些消息的确切含义以及 GCC 自动矢量化的细节的详细文档是相当烦人的。

EDIT:

感谢大卫,我将循环更改为:

 for (unsigned n = a + 1; n < b; n++)

现在,GCC 尝试对循环进行矢量化,但抛出此错误:

 note: not vectorized: unhandled data-ref
 note: Alignment of access forced using peeling.
 note: Vectorizing an unaligned access.
 note: vect_model_induction_cost: inside_cost = 1, outside_cost = 2 .
 note: not vectorized: relevant stmt not supported: D.76777_65 = (float) n_34;

“D.76777_65 = (float) n_34;”是什么意思意思是?


我可能稍微搞砸了细节,但这是您需要重组循环以使其矢量化的方式。诀窍是预先计算迭代次数并从 0 迭代到该数字的小 1。不要改变for陈述。您可能需要修复它之前的两行和循环顶部的两行。他们是大约正确的。 ;)

const unsigned it=(b-a)-1;
const unsigned diff=b-a;
for (unsigned n = 0; n < it; n++)
{
    float d_an = path_res * static_cast<float>(n);
    float d_nb = path_res * static_cast<float>(diff - n);

    float h = elevation_path[n] + (d_an * d_nb) / (2.0f * r_e) - (h_a * d_nb + h_b * d_an) / d_ab;
    float v = h * sqrt((2.0f * d_ab) / (wavelength * d_an * d_nb));

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

为什么 GCC 不自动矢量化这个循环? 的相关文章

  • 如何重写实体数据模型创建的对象上的 Equals?

    我创建了一个实体数据模型 它从 SQLite 数据库中提取记录 其中一个表是 People 我想重写 person Equals 方法 但我不确定去哪里进行这样的更改 因为 Person 对象是自动生成的 我什至看不到该 autogen 代
  • 是否可以使静态控件透明?

    我正在尝试实现一个静态控件 该控件刷新 更改文本 以响应每秒发生一次的某个事件 由于我不想每秒绘制整个客户区域 所以我决定使用静态控件 现在的问题是父窗口被蒙皮 这意味着它有自定义位图作为背景 而静态控件没有适应 所以我正在寻找使静态控件的
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • 获取当前用户的 NetworkCredential (C#)

    我正在尝试从控制台应用程序调用 Web 服务 并且我需要向客户端提供System Net NetworkCredential object 是否有可能创建一个NetworkCredential启动应用程序的用户的对象而不提示输入用户名 密码
  • 带方括号的 Uri.EscapeUriString

    这是一个奇怪的问题 但让我们看看它会得到什么样的回应 如果我编写一个控制台应用程序 VS 2013 NET 4 5 1 并执行这行代码 Uri EscapeUriString 我明白了 但是 如果我执行同样的事情 嗯 从技术上来说Uri E
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 多态性中基类缺少虚拟析构函数 = 资源泄漏?

    我们知道 如果要多态地使用基类 则需要将基类的析构函数指定为 virtual 否则程序中可能会出现资源泄漏 因为只会调用基类析构函数 而不会调用派生对象析构函数 我们还知道构造函数 析构函数纯粹是初始化 未初始化构造 而operator n
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 如何获取错误字符串格式的警告 (C++)

    如果我使用不好的术语 请提前道歉 当我在 gdb 下编译 C 应用程序并使用 printf 时 它会给出有关格式字符串和传入参数的一致性的令人敬畏的警告 例如 这段代码 printf s s foo 导致编译器警告 格式参数太少 这是超级有
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 剥离 OLE 标头信息 (MS Access / SQL Server)

    我有一个 C 应用程序需要支持二进制数据库内容 图像等 当使用 MS Access 或 MS SQL Server 时 此数据被包装在 OLE 对象内 如何去除此 OLE 标头信息 请注意 我不能只查找特定标签的开头 因为内容可以是 png
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState
  • 如何从与 C# lambda 集成(而非代理集成)的 Amazon API 网关获取正确的 http 状态代码?

    我正在使用 C lambda 与 API 网关集成 我希望 API 网关返回正确的错误代码 例如 400 404 500 等 API网关模块tf文件 provider aws version lt 2 70 0 region var aws
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与

随机推荐

  • 如何声明字符串数组(多行)

    为什么 dlls Count返回单个元素 我尝试这样声明我的字符串数组 basePath Split Path MyInvocation MyCommand Path dlls basePath bin debug dll1 dll bas
  • Ionic2 + Angular2 - 带有离子图标星的动态速率值

    我正在尝试构建一个从 0 到 5 颗星的简单动态速率 及其中间值 如 x 5 示例 4 5 该速率从 javascript 接收值 我用 ngFor 寻找一些东西 但我不明白它是如何工作的 有人可以解释 帮助我吗 如果有帮助的话 对于 io
  • iPhone/iPod 模拟器和设备之间的差异

    自从我开始 iPhone iPod 开发以来 我发现模拟器和真实设备的反应之间存在一些差异 也许我会遇到一些其他差异 我也必须弄清楚 也许其他人还没有在这里遇到这些问题 并且可以从知识中受益 也许你知道一些你本来会遇到的问题 差异很高兴在您
  • flutter 的 Image_picker 插件在 iOS 上运行时会导致构建错误

    在 iOS 模拟器上运行 flutter 应用程序时出现此错误 Users sirapol Desktop FirstCareFrontEnd care now frontend v1 build ios Debug iphonesimul
  • .trigger 函数的回调

    我有以下代码 scheduleLink trigger click alert text 这是点击处理程序 scheduleLink bind click function loadScheduleEvent wrap tabs find
  • 嵌套函数中的局部变量

    好吧 请耐心听我说 我知道这看起来会非常复杂 但请帮助我理解发生了什么 from functools import partial class Cage object def init self animal self animal ani
  • 使用 BFS 查找 Boost BGL 图中所有可到达的顶点

    我构建了一个 boost BGL 图 using vertex t std variant
  • 禁用 dat.gui 中按钮的方法?

    我正在尝试找出一种方法来轻松禁用 启用 dat gui 中的按钮 我设置了 dat gui 来控制动画 当动画结束时 我希望禁用 播放 按钮 我尝试向按钮的 DOM 元素添加 禁用 属性 但在设置此属性后单击按钮时 我仍然看到相应的函数会触
  • 在桌面应用程序和网站之间启用单点登录

    我们有一个客户端 服务器应用程序 具有丰富的客户端前端 Net 和管理门户 Asp Net 目前 用户必须在富客户端和网站上登录 我们希望他们能够登录富客户端 但如果他们从客户端内启动网站 则不必登录该网站 我们怎样才能做到这一点 采用另一
  • ES6/Typescript 导入:在一行中导入 * 和名称

    我怎样才能把它写在 1 行上 import as Express from express import Application NextFunction Request Response from express 你的开发者丹 impor
  • 单元测试 SqlFunction

    我有一个公开 IQueryable 的存储库和一个处理特定查询的服务 这里有一些使用 DbFunctions 的方法 为了可测试 我创建了一个带有静态元素列表的假存储库并将其注入到服务中 问题是 由于我的服务查询列表并且不使用数据库 因此我
  • Android studio:调用需要 API 级别 16 错误

    我在 Android studio 中遇到以下错误 这sqlitedatabase close 方法自 API Level 1 起可用 但 android studio ide 无法检测到 几天前 出现了更新版本 版本 AI 130 687
  • MVC 3 Razor Form Post 带多个强类型部分视图不具有约束力

    我很好奇在表单中使用多个强类型部分并回发到包含视图的部分的方法是否是正确的 MVC 处理方法 主视图与以下模型绑定 为简洁起见 省略了其他几个属性和数据注释 public class AccountSetup ViewModelBase p
  • 如何正确使用标签分派来选择构造函数

    我正在尝试为嵌入式系统实现一组互斥锁和锁定类 我以前从未使用过标签调度 我不确定我做得是否正确 boost 文档中包含的描述只有这样 struct input iterator tag 并用它来选择一个专门的模板函数 我没有模板 我只想根据
  • 如何在Intellij Idea中运行Kotlin函数

    我创建了一个测试项目 旨在从 IntelliJ IDEA CE 中的 Kotlin 开始 IDE版本和系统为2017 1 4 Build IC 171 4694 23 构建于2017年6月6日 JRE 1 8 0 112 release 7
  • 将带有 SKEffectNode 的 CIFilter 应用到 SKSpriteNode

    我正在尝试将带有 SKEffectNode 的 CIFilter 应用于 SKSpriteNode 无法让它工作 也不知道为什么 我使用模糊来实现此功能 但无法获得单色照片效果 有人有任何见解吗 再次感谢 Mono Effect not w
  • 为什么 ServiceStack Razor FileSystemWatcher 不能在 Mono + Mac OS X 上工作?

    ServiceStack 对 Razor v2 的新支持使用FileSystemWatcher检测跟踪视图文件的更改并将其标记为无效 以便在下一个请求时重新编译它们 这对于调试非常有用 因为它允许您编辑视图而不是重建 重新启动项目 在我的
  • 不使用 System.IO.FileInfo 获取文件大小?

    是否有可能获得size不使用 C 中的文件System IO FileInfo at all 我知道您可以使用名称和扩展名等其他信息Path GetFileName yourFilePath and Path GetExtension yo
  • 车把 if 语句,索引 = 某个值

    我正在尝试创建一个表 用 JSON 文件中的对象填充每个表单元格 我的车把模板只是添加了每个对象的数据 我想要完成的是 每第 5 个项目创建一个新行 然后继续填充表格单元格 直到第 10 个项目 然后创建一个新行等 我一直在阅读 index
  • 为什么 GCC 不自动矢量化这个循环?

    我正在尝试优化一个占用程序大量计算时间的循环 但是 当我使用 O3 ffast math ftree vectorizer verbose 6 GCC 输出打开自动矢量化时 它无法对循环进行矢量化 我正在使用海湾合作委员会4 4 5 代码