使用 SIMD 查找素数列表 - SSE/AVX

2023-12-12

我很好奇是否有人对如何使用 SIMD 查找素数列表有建议。我特别感兴趣如何使用 SSE/AVX 来做到这一点。

我一直在研究的两种算法是试除法和埃拉托斯特尼筛法。 我设法找到一种使用 SSE 进行试除的方法。我找到了一种更快的除法方法,该方法非常适合向量/标量“使用乘法除以不变整数”http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.1.2556每次我找到素数时,我都会形成结果以进行快速除法并保存它们。然后下次我做除法的时候,速度就会快得多。这样做我得到了大约 3 倍的加速(最多 4 倍)。使用 AVX2 也许也会更快。

然而,试除法比埃拉托斯特尼筛法慢得多,我想不出任何方法可以将 SIMD 与埃拉托斯特尼筛法一起使用,除非使用某种分散指令,甚至 AVX2 都还没有。分散指令有帮助吗?有谁知道这个在 GPU 上用于埃拉托斯特尼筛法吗?

这是我所知道的使用 OpenMP 的埃拉托斯特尼筛法的最快版本。有什么想法可以通过 SSE/AVX 来加快速度吗?http://create.stephan-brumme.com/eratosthenes/

这是我用来确定数字是否为素数的函数。我一次对 8 个素数进行操作(实际上,如果没有 AVX2,一次会操作 4 个素数)。我正在使用 Agner Fog 的向量类。这个想法是,对于大值来说,不可能有连续的八个素数。如果我在八个素数中找到一个素数,我必须按顺序循环结果。

inline int is_prime_vec8(Vec8ui num, Divisor_ui_s *buffer, int size) {
    Divisor_ui div = Divisor_ui(buffer[0].m, buffer[0].s1, buffer[0].s2);
    int val = buffer[0].d; 
    Vec8ui cmp = -1;

    for(int i=0; (val*val)<=num[7]; i++) {
        Divisor_ui div = Divisor_ui(buffer[i].m, buffer[i].s1, buffer[i].s2);
        val = buffer[i].d;
        Vec8ui q = num/div; 
        cmp &= (q*val != num);
        int cnt = _mm_movemask_epi8(cmp.get_low()) || _mm_movemask_epi8(cmp.get_high());
        if(cnt == 0) {
            return size;  //0 primes were found
        }
    }
    num &= cmp;  //at least 1 out of 8 values were found to be prime
    int tmp[8];
    num.store(tmp);

    for(int i=0; i<8; i++) {
        if(tmp[i]) {
            set_ui(tmp[i], &buffer[size++]);
        }
    }       
    return size;
}

这是我设置八个主要候选人的地方。我这样做时跳过了 2、3 和 5 的倍数。

int find_primes_vec8(Divisor_ui_s *buffer, const int nmax) {
    int start[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47};
    int size = sizeof(start)/4;

    for(int i=0; i<size; i++) {
        set_ui(start[i], &buffer[i]);
    }

    Vec8ui iv(49, 53, 59, 61, 67, 71, 73, 77);
    size-=3;
    for(int i=49; i<nmax; i+=30) {
        if((i-1)%100000==0) printf("i %d, %f %%\n", i, 100.f*i/(nmax/16));
        size = is_prime_vec8(iv, &buffer[3], size);
        iv += 30;
    }   
    size+=3;

    return size;
}

None

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

使用 SIMD 查找素数列表 - SSE/AVX 的相关文章

  • SIMD 和 VLIW 指令是一样的吗?

    SIMD 单指令多数据 和 VLIW 超长指令字 到底有什么区别 其中一个是另一个的子集吗 或者它们是两个完全不同的东西 完全不相关且正交 一台机器可以有一个或两个 或者两者都没有 SIMD 指令可以作为扩展添加到 VLIW ISA 但 V
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101
  • ORTOOLS 中的多个 MILP 解决方案 [python]

    我正在尝试使用 Python 中的 or tools 来解决具有多个最佳解决方案的混合整数线性程序 然而 NextSolution 总是返回False 所以我无法检索多个解决方案 我知道这个函数使用约束求解器工作 但我想使用 MILP 求解
  • 优化大数据读写(C++)

    我正在寻求优化 C 模拟应用程序的读取 写入大量数据 称为 映射 的数据本质上由整数 双精度数 浮点数和单个枚举组成 该地图数据的大部分大小是固定的 但一小部分可能会变化 从几KB到几KB 大小 几个这样的映射 通常是数百万个 在应用程序启
  • 用于计算有向图上非循环路径数量的快速算法

    简而言之 我需要一个fast计算简单有向图中有多少条非循环路径的算法 By simple我的意思是没有自环或多重边的图 Apath可以从任何节点开始 并且必须在没有传出边的节点上结束 一条路径是acyclic如果没有边出现两次 我的图 经验
  • 为什么应该或不应该将数据集、数据表等存储为 ASP.NET 页面中的会话变量?

    我正在开发一个使用 Web 服务返回的数据集的 Web 应用程序 当应用程序运行时 我将该数据集存储为会话变量 以便在用户导航到将编辑数据集中的表的不同页面时反复使用 这个想法是 当应用程序加载时 用户只需要等待一次数据 然后应用程序将使用
  • 挑战:优化取消列出[简单]

    因为 SO 最近有点慢 所以我发布了一个简单的问题 如果大鱼们能在这场比赛中留在替补席上并给新秀们一个回应的机会 我将不胜感激 有时我们的对象具有大量的大列表元素 向量 您如何将这个对象 取消列出 到单个向量中 证明你的方法比unlist
  • ICC 中的 -O3 会扰乱内在函数,使用 -O1 或 -O2 或相应的手动汇编即可

    这是后续这个问题 http stackoverflow com questions 49791664 o2 in icc messes up assembler fine with o1 in icc and all optimizatio
  • 为什么Python的“sorted()”比“copy,then.sort()”慢

    这是我运行的代码 import timeit print timeit Timer a sorted x x 2 bla 4 boo 3 4 1 2 0 1 4 3 2 1 0 0 timeit number 1000 print time
  • 如何使用 __m128i 执行元素左移?

    我发现 SSE 移位指令只能在所有元素上移位相同的量 mm sll epi32 mm slli epi32 这些会移动所有元素 但移动量相同 http software intel com sites products documentat
  • WCF - 在服务中抛出故障异常的开销

    我发布了一个question https stackoverflow com questions 81306 wcf faults exceptions versus messages关于使用消息与故障异常在服务之间传达业务规则 我的印象是
  • HTML5 - Canvas - 大图像优化

    我需要建立一个HTML5 canvas其中包含非常大的图像 可能高达 10 15MB 我的第一个想法是将图像分成几个块 这些块将在画布上水平移动时加载 对这个想法有什么想法吗 这是一件好事吗 也许我错过了一些已经实现的优化功能 你说得对 这
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 优化 - 步进可能表现奇怪:iOS/Unity

    我正在尝试将 Unity 集成到 iOS 应用程序中 我已经遵循了这个教程http www agnosticdev com blog entry swift integrating unity and vuforia ios swift p
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • 公共领域还好吗?

    在你像我最初那样做出直觉反应之前 请阅读整个问题 我知道它们让你感觉很脏 我知道我们以前都被烧伤过 我知道这不是 好风格 但是公共场所可以吗 我正在开发一个相当大规模的工程应用程序 该应用程序创建并使用结构的内存模型 从高层建筑到桥梁再到棚
  • Java 反射性能

    使用反射创建对象而不是调用类构造函数是否会导致任何显着的性能差异 是的 一点没错 通过反射查找类是 按幅度 更贵 Quoting Java关于反射的文档 http java sun com docs books tutorial refle
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • Yslow 替代方案 - 针对小型网站的优化

    我正在开发一个基于内部网的小型 Web 应用程序 我安装了 YSlow 它建议我做几件事 但它们似乎与我无关 例如 我不需要 CDN 我的应用程序很慢 所以我想减少请求的带宽 我应该遵守 YSlow 的哪些规则 是否有适用于小型网站的替代工

随机推荐

  • 尝试在 Windows 上创建 Heroku 应用程序时出错

    当我尝试做的时候heroku create我收到以下错误消息 d Ruby187 lib ruby gems 1 8 gems heroku 2 0 1 lib heroku command base rb 83 in read No su
  • Python += 带有列表和元组[重复]

    这个问题在这里已经有答案了 我在网上看到有人写了一个有趣的Python行 但不明白为什么它有效 所以我们可以在 python 解释器中尝试以下几行 s 1 s s 1 1 这将导致错误 TypeError 只能将列表 而不是 元组 连接到列
  • OS X 上的 Python 2.7:TypeError:“frozenset”对象不可在每个命令上调用

    我使用 Python 的每个命令都出现此错误 tmp sudo easy install pip Traceback most recent call last File usr bin easy install 2 7 line 11 i
  • CoordinatorLayout 留空底部空间

    我正在使用 Xamarin 开发 Android 应用程序 我使用 ViewPager 和 TabLayout 来进行选项卡导航 但我的 ViewPager 即使使用 height match parent 也不会填充整个屏幕 我相信这是
  • 如何设置集群从节点(在Windows上)

    我需要在 15 台机器 每台 4 核 上运行数千 个模型 所有机器都是 Windows 我开始学习parallel snow and snowfall包并阅读了一堆介绍 但他们主要关注主控的设置 关于如何在 Windows 上设置工作 从
  • UITabBar全透明

    在 XCode 中 我使用界面生成器 StoryBoard 来布置大部分布局 不过我想要一些自定义绘图 这非常有效 然而我面临着一个问题 我从活动选项卡中 咬了一口 看http cl ly Efno 我希望这一口完全透明 我设置了粉红色背景
  • Redis + Node.js - 如何检索值

    我正在使用带有 Node js 的 Redis 数据库 使用client hmset jobs jobId 12345 JSON stringify jsonJob 我存储 JSON 字符串化作业 现在我想迭代所有作业并检索作业 ID 和字
  • 使用 Firemonkey/Delphi 打开 Android 26 PDF 文件时出现异常

    我正在使用 Delphi 10 1 Berlin 开发 Android 移动应用程序 我需要从应用程序中打开 PDF 文件 但出现错误 android os FileUriExposeException file Storage emula
  • 在 JavaScript 中创建一个新的 Location 对象

    是否可以在 JavaScript 中创建一个新的 Location 对象 我有一个字符串形式的 url 我想利用 javascript 已经提供的内容来访问它的不同部分 这是我正在谈论的一个例子 我知道这不起作用 var url new w
  • 如何备份 MySQL 数据库?

    备份包含数百万条目的数据库时需要考虑什么 有没有我可以使用的工具 可能与 MySQL 服务器捆绑在一起 根据您的要求 我自己一直在使用以下几种选项 如果不需要热备份 请关闭数据库服务器并在文件系统级别进行备份 即 e 使用 tar rsyn
  • mySQL 在一个查询中从多个表获取信息

    我对 SQL 非常陌生 在尝试了一些不同的 google 搜索并阅读了一些 SQL 教程后 似乎无法获取所需的信息 我认为它涉及某种连接 但无法将它们弄直 给出以下示例表 表 1 活动 每次任务更改时都会更新 每天可能更新多次 ID Who
  • 使用 ID 令牌进行 REST API Firestore 身份验证

    我有一个 Firestore 数据库和一个用户 在用户通过 REST 请求登录后 我能够检索用户的 ID 令牌 我将使用 ID 令牌来请求从数据库读取 写入 当安全规则打开 任何人都可以读 写 时 我可以使用 Python 请求以这种方式读
  • 如何检索 Mongodb 数组中存在的所有匹配元素?

    我有如下所示的文档 name testing place London documents x 1 y 2 x 1 y 3
  • JavaFX TableView 和 ObservableList - 如何自动更新表?

    我知道类似的问题已经在不同的日期被问过 但我会在这里放置一个 SSCCE 并尝试简单地提出这个问题 我希望能够更新数据模型 并自动更新其上的任何视图 这样任何更新模型的调用者都不知道当前存在的任何视图 这是我到目前为止学到 尝试过的 并且没
  • 无法以正确的格式对特殊字符电子邮件、gmail api 和 ae.net.mail 进行编码

    我正在开发一个可以发送带有附件的电子邮件的应用程序 它可以工作 直到我尝试特殊字符 我尝试了一下不同的编码 看起来主题是用 ISO 8859 1 编码的 而邮件的其余部分是用 UTF 8 编码的 这是我生成 Google Gmail API
  • 使用 CodeRunner 扩展通过 VStudio Code 运行 C++

    我无法使用 Code Runner 扩展从 VStudio Code 运行我的 cpp 文件 当我更换时 include test h with include test cpp 主要它工作正常 但将其替换回来会给我以下错误 运行 cd c
  • Facebook OAuthException:(#1)

    我有一些将图像上传到用户个人资料的应用程序 几个小时前 所有应用程序都工作正常 但现在请求上传时 会出现此错误 Fatal error Uncaught OAuthException 1 An unknown error occurred
  • WordPress插件如何添加内容?

    这可能是一个奇怪的问题 当我添加 Facebook Like Button 和 Gigpress 等插件时 它们提供了在每个单页博客文章之前或之后插入内容的选项 例如 我将 Gigpress 和 FB Like 按钮设置为在我的帖子文本下方
  • Oracle 触发器每月检查约束

    只是想知道是否可以创建一个触发器来每月检查指定的约束基础 eg 桌租 ID 会员 书籍 1 约翰 童话 2 约翰 摩擦 3 约翰 漫画 4 约翰 杂志 限制 会员每月只允许借阅4本书 我想过使用 count book 有什么建议吗 使用触发
  • 使用 SIMD 查找素数列表 - SSE/AVX

    我很好奇是否有人对如何使用 SIMD 查找素数列表有建议 我特别感兴趣如何使用 SSE AVX 来做到这一点 我一直在研究的两种算法是试除法和埃拉托斯特尼筛法 我设法找到一种使用 SSE 进行试除的方法 我找到了一种更快的除法方法 该方法非