问题标签 [avx]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
865 浏览

caching - 使用 SSE/AVX 对压缩双向量部分进行非时间存储

这搭载了我之前关于将__m256d向量的各个元素散布到不同的内存位置(分散操作)的问题。我的代码将大量数据存储到内存中,这些数据“很长一段时间”都不会再次访问。我想通过使用非临时提示指令来减少所有这些存储产生的缓存污染量。但是,我想不出一个好的方法来做到这一点。这是我的代码现在的样子的摘要:

我想使用非临时提示执行 64 位存储,但似乎没有办法直接从 XMM 寄存器执行此操作。实现这一目标的最佳方法是什么?

0 投票
3 回答
4247 浏览

x86 - _mm_alignr_epi8 (PALIGNR) 等效于 AVX2

在 SSE3 中,PAligNR 指令执行以下操作:

PARIGNR 将目标操作数(第一个操作数)和源操作数(第二个操作数)连接成一个中间组合,将组合以字节粒度向右移动一个常量立即数,并将右对齐的结果提取到目标中。

我目前正在移植我的 SSE4 代码以使用 AVX2 指令并使用 256 位寄存器而不是 128 位。天真地,我相信内在函数(VALIGNR)执行与仅在 256 位寄存器上_mm256_alignr_epi8相同的操作。_mm_alignr_epi8然而可悲的是,情况并非如此。实际上,_mm256_alignr_epi8将 256bit 寄存器视为 2 个 128bit 寄存器,对相邻的两个 128bit 寄存器执行 2 次“对齐”操作。_mm_alignr_epi8一次有效地执行与 2 个寄存器相同的操作。在这里最清楚地说明了这一点:_mm256_alignr_epi8

目前我的解决方案是_mm_alignr_epi8通过将 ymm(256 位)寄存器分成两个 xmm(128 位)寄存器(高和低)来继续使用,如下所示:

这行得通,但必须有更好的方法,对吧?是否应该使用更“通用”的 AVX2 指令来获得相同的结果?

0 投票
1 回答
813 浏览

compilation - 我可以将 OpenCL 代码编译成普通的、无 OpenCL 的二进制文件吗?

我正在为我的目的评估 OpenCL。我突然想到,你不能假设它在 Windows 或 Mac 上开箱即用,因为:

  • Windows 需要一个 OpenCL 驱动程序(当然,可以安装)
  • MacOS 仅在 MacOS >= 10.6 上支持 OpenCL

因此,我必须分别编写 FPU/SSE/AVX 代码和 OpenCL 以生成两个二进制文件:一个不支持 OpenCL,一个支持 OpenCL。

如果我可以在编译时将 OpenCL编译成 SSE/AVX,然后发布一个没有OpenCL的二进制文件,那就更好了。这样我就不需要为 FPU/SSE/AVX 单独实现了!

有没有办法做到这一点?

干杯,-克莱门斯

0 投票
1 回答
1064 浏览

windows - 常见的调用约定如何处理 AVX 寄存器?

我找不到任何定义调用者和被调用者如何处理 YMM 寄存器的文档。

为了集中我的问题,这是我想知道的:

  1. 在返回给调用者之前,被调用者必须恢复哪些 YMM 寄存器?
  2. 由于 Linux 和 Windows 中的 XMM 寄存器存在差异,我假设 YMM 寄存器也不遵循相同的规则。每个操作系统的规则是什么?

编辑:感谢下面的答案,我能够在提到的 Win64 文档中找到答案。我很确定 Linux 遵循类似的规则:

0 投票
4 回答
23157 浏览

c++ - 使用 AVX 内在函数而不是 SSE 并不能提高速度——为什么?

我使用 Intel 的 SSE 内在函数已经有相当长的一段时间了,性能得到了很好的提升。因此,我希望 AVX 内在函数能够进一步加速我的程序。不幸的是,直到现在情况并非如此。可能我犯了一个愚蠢的错误,所以如果有人能帮助我,我将不胜感激。

我使用带有 g++ 4.6.1 的 Ubuntu 11.10。我编译了我的程序(见下文)

测试系统采用 Intel i7-2600 CPU。

这是说明我的问题的代码。在我的系统上,我得到了输出

请注意,选择计算 sqrt(sqrt(sqrt(x))) 只是为了确保内存带宽不会限制执行速度;这只是一个例子。

简单示例.cpp:

任何帮助表示赞赏!

0 投票
1 回答
2101 浏览

c++ - md5 矢量化 sse* && avx

我正在寻找有关使用矢量化实现 md5 算法的信息。我对 SSE* 和 AVX 指令的详细信息感兴趣。是否有任何现成的库支持矢量化?

0 投票
1 回答
2368 浏览

linux - AVX 优化代码未在 linux redhat 5.6 上运行

我有一些简单的测试代码,我正在尝试生成 AVX 优化代码,以便在 linux Redhat 5.6 上使用 icc v12.1。代码如下所示:

我编译它(并且矢量报告说循环是矢量化的):

当我运行代码时,出现以下错误:

我确定该处理器支持 AVX,但其他人是否对 Redhat 5.6 上的 AVX 有问题?

0 投票
2 回答
852 浏览

optimization - 128 位 SSE 计数器?

我需要一个周期为 2^128 的 __m128i 变量的函数。它不需要单调增加(如计数器),而是访问每个值一次。

我能想到的最简单的例子实际上是一个 128 位的计数器,但我发现这很难在 SSE 中实现。有没有更简单/更快的解决方案?

0 投票
1 回答
2854 浏览

c - SSE 将整数加载到 __m128

将 4 个整数和 8 个整数加载到(对齐/未对齐)的 gcc 的内在特性是ints什么?怎么样?__m128__m256unsigned ints

0 投票
1 回答
1601 浏览

c - SSE 整数与浮点数练习

在 SSE (AVX) 中同时处理整数和浮点数时,将所有整数转换为浮点数并仅使用浮点数是一种好习惯吗?因为在那之后我们只需要一些 SIMD 指令,而我们需要使用的只是加法和比较指令(<, <=, ==),我希望这种转换应该完全保留。