如何让下面的代码更快

2024-01-06

int u1, u2;  
unsigned long elm1[20], _mulpre[16][20], res1[40], res2[40]; 64 bits long     
res1, res2 initialized to zero.  

l = 60;  
while (l)  
{  
    for (i = 0; i < 20; i += 2)  
    {  
        u1 = (elm1[i] >> l) & 15;  
        u2 = (elm1[i + 1] >> l) & 15;

        for (k = 0; k < 20; k += 2)  
        {  
            simda = _mm_load_si128 ((__m128i *) &_mulpre[u1][k]);  
            simdb = _mm_load_si128 ((__m128i *) &res1[i + k]);  
            simdb = _mm_xor_si128  (simda, simdb);  
            _mm_store_si128 ((__m128i *)&res1[i + k], simdb);  

            simda = _mm_load_si128 ((__m128i *)&_mulpre[u2][k]);  
            simdb = _mm_load_si128 ((__m128i *)&res2[i + k]);  
            simdb = _mm_xor_si128  (simda, simdb);  
            _mm_store_si128 ((__m128i *)&res2[i + k], simdb);  
        } 
    }
    l -= 4;
    All res1, res2 values are left shifted by 4 bits.  
}

上面提到的代码在我的程序中被调用了很多次(分析器显示 98%)。

编辑:在内部循环中,对于相同的 (i + k) 值, res1[i + k] 值被加载多次。我在 while 循环中尝试使用此方法,将所有 res1 值加载到 simd 寄存器(数组)中,并在最里面的 for 循环中使用数组元素来更新数组元素。两个 for 循环完成后,我将数组值存储回 res1、re2。但计算时间随之增加。知道我哪里错了吗?这个想法似乎是正确的

欢迎任何使其更快的建议。


不幸的是,最明显的优化可能已经由编译器完成了:

  • 你可以拉&_mulpre[u1] and &mulpre[u2]我们的内循环。
  • 你可以拉&res1[i]我们的内循环。
  • 对两个内部操作使用不同的变量并对它们重新排序,可能会实现更好的流水线操作。

交换外部循环可能会改善缓存局部性elm1.

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

如何让下面的代码更快 的相关文章

  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • 对数字进行向上和向下舍入 C++

    我试图让我的程序分别向上和向下舍入数字 例如 如果数字是3 6 我的程序应该四舍五入最接近的数字 4 如果该数字是3 4 它将向下舍入为 3 我尝试使用ceil库获取 3 个项目的平均值 results ceil marks1 marks2
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 用于计算有向图上非循环路径数量的快速算法

    简而言之 我需要一个fast计算简单有向图中有多少条非循环路径的算法 By simple我的意思是没有自环或多重边的图 Apath可以从任何节点开始 并且必须在没有传出边的节点上结束 一条路径是acyclic如果没有边出现两次 我的图 经验
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • for 循环 - 没有效果的语句

    由于某种原因 我收到错误 statement with no effect关于这个声明 for j idx j lt iter j increment printf from loop idx i int idx punc ctxt j 你
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

    bool 的最小大小不应该是 1 个字节吗 这有点学术性的东西 尽管它们会转换为数字 并且 与其他所有事物一样 它们最终将基本上由计算机内存中的数字表示 但布尔值不是数字 你的bool可以取值true 或值false 即使您确实需要至少 1
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 删除对象时指针自动指向空

    假设我有一个对象和其他几个不同类类型的对象中的 10 个指向它的指针 如果对象被删除 这些指针必须设置为空 通常我会将对象的类与具有指向它的指针的类互连 以便它可以通知它们它正在被删除 并且它们可以将它们的指针设置为空 但这也有一个负担 即
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • 从 C# 中的 .NET SecureString 读取单个字符?

    WPF 的PasswordBox 返回一个SecureString 它对窥探者隐藏密码 问题是你最终必须获得密码的值 而我在网上找到的建议都涉及将值复制到字符串中 这会让你回到窥探者的问题 IntPtr bstr Marshal Secur
  • 在 C# 中读取/写入命令行程序

    我正在尝试与 C 的命令行程序进行对话 它是一个情绪分析器 它的工作原理如下 CMD gt java jar analyser jar gt Starting analyser 这是我想从我的 C 程序插入内容的地方 例如 I love y

随机推荐

  • 在 C 中创建字符串数组

    我想创建一个包含 N 个位置的数组 在每个位置 我想存储一个10个字符的字符串 这就是我尝试过的 在给出的示例中 N 15 但是这个数字可以改变 char userArray 10 malloc sizeof char 10 15 编译 i
  • ImageMagick 缺少解码委托

    我最近搬到 MediaTemple 并按照他们的知识库文章安装了 ImageMagick 和 IMagickhere http kb mediatemple net questions 1778 Is ImageMagick install
  • “无法在任何存储库中找到有效的 gem”(rubygame 等)

    我尝试安装这个 rubygame gem有一段时间了 但是每当我使用该命令时 gem install rubygame 它会给出一个错误 ERROR Could not find a valid gem rubygame gt 0 in a
  • 等待执行器中的所有线程完成?

    我正在实现并行快速排序作为编程实践 完成后 我阅读了 Executors 上的 Java 教程页面 这听起来像是它们可以使我的代码更快 不幸的是 我依靠 join 来确保程序在所有内容都排序完成之前不会继续 现在我正在使用 public s
  • 如何防止 grep 打印尾随换行符?

    我在用grep产生将由另一个程序解析的输出 但是 该程序期望输出仅为数字或零字节 Now grep在输出后输出一个换行符 我已经检查过 Z选项 但它似乎不起作用 因为我正在使用 grep 进行计数 c 我正在执行sh not bash 所以
  • 如何使用 JavaScript/jQuery 将新数据发布到 CouchDB

    我找到了答案here https stackoverflow com questions 2099728 how do i send an ajax request on a different port with jquery对于下面的问
  • C语言中为什么会有NULL?

    为什么有一个NULL在C语言中 是否有一个上下文 其中只是简单的文字0会不会工作完全一样 实际上 你可以使用文字0任何你会使用的地方NULL 第 6 3 2 3p3 节C标准 http www open std org jtc1 sc22
  • Flutter:从其他页面访问存储的 Sharedpreference 值

    我正在一个名为的页面中存储一个值page1 dart 我想访问存储的值page2 dart or page3 dart 我怎样才能实现这个目标 Flutter 共享首选项实际上是作为内存缓存实现的 你第一次打电话的时候SharedPrefe
  • 使用 OpenCV 时 Apple Mach-O 链接器和多个“未定义符号”错误

    我目前是 Objective C 的真正初学者 我正在使用 OpenCV 框架开发一个应用程序 我正在遵循教程 但是在构建项目时 我遇到了几个错误 Undefined symbols for architecture i386 std 1
  • 获取 Android 上的所有总空间和可用空间

    据我所知 Android 上有 应用程序和缓存的内部存储器 某些手机 上的内置 SD 卡 不可拆卸 用于存储音乐和照片的外部 SD 卡 可拆卸 如何通过检查它们是否存在来获取每个手机的总数和可用数量 某些手机没有内部 SD 卡 Thanks
  • iOS - 链接器错误、重复符号

    似乎我在尝试编译时遇到错误 它似乎直接指向两个文件 MenuViewController 和 FirstTopViewController 我认为这与我的导入有关 因为它们每个都在导入另一个 但是错误引用了我的 Building 对象 该对
  • 打瞌睡模式和应用程序待机

    我如何在我的应用程序中知道手机是否处于打瞌睡模式或我的应用程序是否处于待机模式 我也可以通过某种订阅方式知道吗 有一个区别应用程序待机 您的应用程序转到的位置 睡觉是因为很孤独 和Doze 系统去哪里 睡觉 因为用户有生命 Doze仅当您的
  • 使用 Dapper 映射 SqlGeography

    我有实体 Point 其中包含 ID 文本和地理坐标 CREATE TABLE Point Id INT IDENTITY CONSTRAINT PK Point Id PRIMARY KEY Coords GEOGRAPHY NOT NU
  • android ConstraintLayout 不允许负边距

    我相对于布局指南放置了很多项目 并希望将新项目放置在几乎与此布局指南相关的位置 我尝试使用负布局边距但没有成功 android translationX 10dp android translationY 10dp
  • Laravel:使用 AJAX 请求渲染部分视图

    我正在尝试制作一个单页 CRUD 应用程序 并且将 AJAX 与 jQuery 结合使用 在本例中 我提交表单并在数据库中异步存储一个新国家 地区 然后使用新数据渲染部分视图 这是我的脚本和从数据库检索国家 地区并返回部分视图的方法 cre
  • 写入错误:使用 O_DIRECT 打开文件时参数无效

    对我来说 用以下内容写入文件非常重要O DIRECT flag 这就是我打开文件的方式 Open the file int fd if fd open inFilepath O WRONLY O CREAT O SYNC O DIRECT
  • 在表达式中的 let .. 中使用守卫

    有时我会写这样的代码 solveLogic Int gt Int gt Int solveLogic a b let x 1 brainiac a gt x 1 a b 333 otherwise 5 in brainiac 每次我都想写这
  • IPython Notebook 之前的单元格内容

    是否可以在 IPython Notebook 单元格中获取上一个 上方 单元格内容 我可以使用 capture 魔术函数查看以前的输出 但我不知道如何获取以前的单元格内容 recall jupyter notebook cell numbe
  • 普通 Javascript 对象上的 jQuery.bind() 事件

    是否可以将 jQuery 事件绑定到普通的非 DOM Javascript 对象 var myobject myobject bind foobar function alert daa myobject trigger foobar 有何
  • 如何让下面的代码更快

    int u1 u2 unsigned long elm1 20 mulpre 16 20 res1 40 res2 40 64 bits long res1 res2 initialized to zero l 60 while l for