使用 clang/g++ 时 __m256i 数组出现分段错误

2024-04-03

我正在尝试生成数组__m256i在另一个计算中重用。当我尝试这样做时(即使使用最小的测试用例),我也会遇到分段错误 - 但前提是代码是使用 g++ 或 clang 编译的。如果我使用 Intel 编译器(版本 16.0)编译代码,则不会发生分段错误。这是我创建的一个测试用例:

int main() {
    __m256i *table = new __m256i[10000];
    __m256i zeroes = _mm256_set_epi64x(0, 0, 0, 0);
    table[99] = zeroes;
}

当使用 clang 3.6 和 g++ 4.8 编译上述内容时,会出现分段错误。

这是英特尔编译器生成的程序集(来自https://gcc.godbolt.org/ https://gcc.godbolt.org/,国际商会 13.0):

pushq     %rbx                                          #3.12
movq      %rsp, %rbx                                    #3.12
andq      $-32, %rsp                                    #3.12
pushq     %rbp                                          #3.12
pushq     %rbp                                          #3.12
movq      8(%rbx), %rbp                                 #3.12
movq      %rbp, 8(%rsp)                                 #3.12
movq      %rsp, %rbp                                    #3.12
subq      $112, %rsp                                    #3.12
movl      $3200, %eax                                   #4.38
vzeroupper                                              #4.38
movq      %rax, %rdi                                    #4.38
call      operator new[](unsigned long)                 #4.38
movq      %rax, -112(%rbp)                              #4.38
movq      -112(%rbp), %rax                              #4.38
movq      %rax, -104(%rbp)                              #4.20
vxorps    %ymm0, %ymm0, %ymm0                           #5.22
vmovdqu   %ymm0, -80(%rbp)                              #5.22
vmovdqu   -80(%rbp), %ymm0                              #5.22
vmovdqu   %ymm0, -48(%rbp)                              #5.20
movl      $3168, %eax                                   #6.17
addq      -104(%rbp), %rax                              #6.5
vmovdqu   -48(%rbp), %ymm0                              #6.17
vmovdqu   %ymm0, (%rax)                                 #6.5
movl      $0, %eax                                      #7.1
vzeroupper                                              #7.1
leave                                                   #7.1
movq      %rbx, %rsp                                    #7.1
popq      %rbx                                          #7.1
ret                                                     #7.1

这是 clang 3.7 的内容:

pushq   %rbp
movq    %rsp, %rbp
andq    $-32, %rsp
subq    $192, %rsp
xorl    %eax, %eax
movl    $3200, %ecx             # imm = 0xC80
movl    %ecx, %edi
movl    %eax, 28(%rsp)          # 4-byte Spill
callq   operator new[](unsigned long)
movq    %rax, 88(%rsp)
movq    $0, 168(%rsp)
movq    $0, 160(%rsp)
movq    $0, 152(%rsp)
movq    $0, 144(%rsp)
vmovq   168(%rsp), %xmm0        # xmm0 = mem[0],zero
vmovq   160(%rsp), %xmm1        # xmm1 = mem[0],zero
vpunpcklqdq     %xmm0, %xmm1, %xmm0 # xmm0 = xmm1[0],xmm0[0]
vmovq   152(%rsp), %xmm1        # xmm1 = mem[0],zero
vpslldq $8, %xmm1, %xmm1        # xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7]
vmovaps %xmm1, %xmm2
vinserti128     $1, %xmm0, %ymm2, %ymm2
vmovaps %ymm2, 96(%rsp)
vmovaps %ymm2, 32(%rsp)
movq    88(%rsp), %rax
vmovaps %ymm2, 3168(%rax)
movl    28(%rsp), %eax          # 4-byte Reload
movq    %rbp, %rsp
popq    %rbp
vzeroupper
retq

我是否在 clang/g++ 中遇到编译器错误?或者我只是做错了什么?


我猜问题与错误的内存对齐有关。vmovaps要求内存位置从 32 字节边界开始,并且vmovdqu才不是。这就是为什么 Intel 版本可以工作而 clang/g++ 代码崩溃的原因。我不知道这是否是编译器错误,但无论如何您可能都需要对齐。

下面的代码应该可以工作,尽管它更像是 C 语言而不是 C++ 语言。

int main() {
  __m256i *table = (__m256i*) memalign( 32, 10000 * sizeof(__m256i) );
  __m256i zeroes = _mm256_set_epi64x(0, 0, 0, 0);
  table[99] = zeroes;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 clang/g++ 时 __m256i 数组出现分段错误 的相关文章

随机推荐

  • 存储应用程序(库存应用程序)崩溃(在Android模拟器中)

    当我尝试打开Storage from 设置菜单在模拟器中 它 总是 崩溃并显示以下 logcat 输出 java lang NullPointerException at com android settings deviceinfo St
  • C++ 开源随机数生成算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要连续生成 1 10000 范围内的随机数 不能重复 有什么建议吗 描述 我们正在为我们的应用程序
  • iPhone - 在本地和生产环境设置之间切换

    我正在开发一个 iPhone 应用程序 它使用某处的服务器来获取其数据 在应用程序源代码的某个位置 我对用于连接的 URL 进行了硬编码 这很好 只是我并不总是想使用生产服务器进行测试 我不想弄乱实时数据 只是为了在本地测试一些东西 所以我
  • Modernizr 检查以检测 Firefox [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 使用 Modernizr 可以进行哪些检查来检测 Firefox 功能 即使不建议对功能进行浏览器检测 它也可以用于呈现其他类型的信息
  • 在selenium中使用隐式等待

    我是初学者 我理解等待的基本作用 但我对互联网上不同的教程如何放置和解释它感到困惑 例如 在下面的代码中 它被放置在加载 URL 之前 那么 是否只是等待 URL 加载或查找元素或两者兼而有之 如果我在 try 块中使用隐式等待一次 它是否
  • Console2中使用vim能识别吗?

    With Steven Harman 的 Solarized 调整 https github com stevenharman console2 solarized对于 Console2 我或多或少可以使用晒伤 http ethanscho
  • 使无序列表跨越 div 宽度的 100%

    div ul li First li li Second li li Third li li Fourth li ul div div width 100 li list style none float left 使用CSS 有没有办法让
  • 适用于 Databricks、Synapse 和 ADLS gen2 的数据治理解决方案

    我是数据治理的新手 如果问题缺少一些信息 请原谅我 客观的 我们正在 Azure 平台上为中型电信公司从头开始构建数据湖和企业数据仓库 我们使用 ADLS gen2 Databricks 和 Synapse 进行 ETL 处理 数据科学 M
  • 使用 d3.json() 获取数据不起作用,而使用 JS async wait 则可以。为什么? [复制]

    这个问题在这里已经有答案了 我正在尝试从 url 获取一些数据以在 d3 js 中使用 我无法使用来获取数据d3 json url callback 虽然我使用 ES8 时效果很好async await功能 有人可以帮助我理解为什么吗 我究
  • NSCell 与 NSView:当需要许多控件时

    我知道 Apple 不赞成使用NSCell赞成NSView 请参阅 AppKit 10 10 发行说明 此前曾建议NSCell当需要许多控制时出于性能原因使用 我花了相当多的时间来实现一个需要很多子视图的自定义控件 并且使用 NSView
  • 从 parquet 文件创建 SQL 表

    我正在使用 R 来处理大型数据集 最大数据帧 30 000 000 x 120 这些文件作为 parquet 文件存储在 Azure Datalake 存储中 我们需要每天查询这些文件并将其还原到本地 SQL 数据库中 无需将数据加载到内存
  • “DropDownList.SelectedIndex = -1”问题

    我只想要一个没有选定项目的 ASP NET DropDownList 到目前为止 将 SelectedIndex 设置为 1 没有任何作用 我正在使用 Framework 3 5 和 AJAX 即这个 DropDownList 位于 Upd
  • 通过 Kerberos 使用 Active Directory 进行身份验证

    我正在构建一个需要不同级别身份验证的 Android 应用程序 并且我想使用 Active Directory 来实现这一点 据我所知 使用 Kerberos 是 Microsoft 建议的方式 对于 Android 我该如何执行此操作 我
  • pip 显示错误“lsb_release -a”返回非零退出状态 1

    我正在尝试使用 pip 安装软件包 但它抛出错误 我用过的命令 sudo pip install selenium 它显示的错误 Exception Traceback most recent call last File usr loca
  • 删除或替换 javascript 中模式内的子字符串

    我需要 Javascript 中正则表达式的帮助 我正在寻找一种替换子字符串的方法 仅当它在引号内时 这是我的案例 源字符串 aa aa aa bbb bbb ccc sub string to remove 所需的字符串 aa aa aa
  • Task.IsCancelled 不起作用

    我有以下示例代码 static class Program static void Main var cts new CancellationTokenSource var task Task Factory StartNew gt try
  • 在Javascript中,这个下划线是什么意思?

    var Gallery Backbone Controller extend index null photos null album null subalbums null subphotos null data null photosv
  • scala 列表与泛型的模式匹配[重复]

    这个问题在这里已经有答案了 我有课 case class MyClass T values List T 我正在尝试创建一个函数 它将根据 T 的类型返回一个值 def myFunc T values match case v List B
  • TFS 2017.3.1 合并集合 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们目前使用 TFS 2017 3 1 On Prem 我们有 1 个非常大的收藏和另一个较小的收藏 我们想将较小的收藏移至较大的收藏
  • 使用 clang/g++ 时 __m256i 数组出现分段错误

    我正在尝试生成数组 m256i在另一个计算中重用 当我尝试这样做时 即使使用最小的测试用例 我也会遇到分段错误 但前提是代码是使用 g 或 clang 编译的 如果我使用 Intel 编译器 版本 16 0 编译代码 则不会发生分段错误 这