问题标签 [avx2]

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 投票
1 回答
262 浏览

c - 如何检查 256i(16 位)向量以了解它是否包含任何大于零的元素?

我正在将向量化代码从 SSE2 内在函数转换为 AVX2 内在函数,并且想知道如何检查 256i(16 位)向量是否包含任何大于零的元素。以下是 SSE2 中使用的代码:

我认为下面的代码会起作用,但它没有。

如果有人可以提供建议,我将不胜感激

0 投票
2 回答
896 浏览

c++11 - 基于布尔掩码将元素移动到 SIMD 寄存器的左侧

这个问题与此有关:Optimal uint8_t bitmap into a 8 x 32bit SIMD "bool" vector

我想用这个签名创建一个最佳函数:

所需的行为是在 64 位 int 的输入上,如下所示:

输入向量 = {42, 17, 13, 3}

boolVector = {真,假,真,假}

false它屏蔽了中的所有值,boolVector然后重新打包保留在左侧的值。在上面的输出中,返回值应该是:

{42, 13, X, X}

... X 是“我不在乎”。

一个明显的方法是使用_mm_movemask_epi8从 bool 向量中获取 8 字节 int,在表中查找 shuffle 掩码,然后使用掩码进行 shuffle。

但是,如果可能的话,我想避免使用查找表。有更快的解决方案吗?

0 投票
0 回答
817 浏览

c++11 - _mm256_shuffle_epi32 的 Clang 内在函数

我正在尝试在 Clang 上编译一些 AVX2 代码。但是,似乎 AVX2 的 clangs 实现不符合英特尔的内在文档。

这段代码

结果是:

如果尝试只是进行洗牌,我会得到:

根据这个:

https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-04EC3E64-539B-414D-AE0E-D2B2DDBDB401.htm

使用仅在运行时才知道的控制掩码进行随机播放应该是完全可行的(如果不是,那么随机播放就没有太多意义了?)。Shuffle 也应该返回 a __m256i,但 clang 似乎认为该方法没有返回任何内容。

我包括<immintrin.h>.

我也尝试过置换,似乎同样破碎。有什么想法可以按照 Clang 中的规定进行随机播放吗?

0 投票
3 回答
450 浏览

c - 使用向量扩展时让 GCC 生成 PTEST 指令

使用 C 的 GCC 向量扩展时,如何检查向量上的所有值是否为零?

例如:

SSE4.2 具有PTEST允许运行测试的指令,就像用作for条件的测试一样,但 GCC 生成的代码只是解包向量并一一检查单个元素:

有没有办法让 GCC 生成一个有效的测试而不恢复使用内在函数?

更新:作为参考,使用不可移植的 GCC 内置代码(V)PTEST

0 投票
1 回答
4778 浏览

c - 将 __m256i 存储为整数

如何将 __m256i 数据类型存储为整数?

我知道对于花车有:

其中第一个参数是输出数组。

对于我只找到的整数:

其中两个参数都是 __m256i 数据类型。

做这样的事情是否足够:

(我使用它作为函数的参数,我想获得它的值)

内部函数:

这个可以吗?

- - -更新 - - - - - - - - - - - -

好的,如果我有:

0 投票
1 回答
1033 浏览

intel - 可以创建大量 AVX/SSE 值吗

我正在使用 AVX2/SSE 指令并行化某个动态编程问题。

在我计算的主要迭代中,我计算矩阵中的列,其中每个单元格都是 AVX2 寄存器 ( _m256i) 的结构。我使用前一个矩阵列中的值作为计算当前列的输入值。列可能很大,所以我要做的是我有一个结构数组(在堆栈上),其中每个结构都有两个_m256i元素。

结构:

然后我有这样的数组:Cell prevColumn [N]N通常会是几百。

我知道它_m256i基本上代表一个 avx2 寄存器,所以我想知道我应该如何看待这个数组,它的行为如何,因为 N 远大于 16(这是 avx 寄存器的数量)?创建这样一个数组是一种好习惯,还是在存储大量_m256i即将真正重用的值时我应该使用一些更好的方法?

另外,我应该对这些结构进行任何调整吗?我读了很多关于对齐的文章,但我仍然不确定如何以及何时准确地进行对齐。

0 投票
1 回答
808 浏览

c++11 - 使用基于掩码的 simd 从大向量加载向量

我希望有人可以在这里提供帮助。

我有一个大字节向量,我从中创建一个小字节向量(基于掩码),然后我使用 simd 处理它。

目前,掩码是 baseOffset + submask (byte[256]) 的数组,针对存储进行了优化,因为有 > 10^8 。我创建了一个 maxsize 子向量,然后循环遍历掩码数组,将 baseOffsset 乘以 256,并为掩码中的每个位偏移量从大向量加载并将值顺序放入较小的向量中。然后通过多个 VPMADUBSW 处理较小的向量并累积。我可以改变这个结构。例如,遍历位一次以使用 8K 位数组缓冲区,然后创建小向量。

有没有更快的方法可以创建子数组?

我将代码从应用程序中提取到测试程序中,但原始代码处于不断变化的状态(移至 AVX2 并从 C# 中提取更多内容)

通常,对于某些工作负载,掩码使用率为 5-15%,为 25-100%。

MASKMOVDQU 已关闭,但我们必须在保存之前根据掩码重新打包 /swl..

0 投票
2 回答
869 浏览

c++ - AVX2 赢家通吃视差搜索

我正在使用 AVX2 优化视差估计算法的“赢家通吃”部分。我的标量例程是准确的,但在 QVGA 分辨率和 48 个视差下,运行时间在我的笔记本电脑上大约 14 毫秒,令人失望。我创建了 LR 和 RL 视差图像,但为了简单起见,我将只包含用于 RL 搜索的代码。

我的标量例程:

我尝试使用 AVX2:

视差空间图像 (DSI) 的大小为 HxWxD (320x240x48),我将其水平布局以便更好地访问内存,这样每一行的大小都是 WxD。

视差空间图像具有每像素匹配成本。这与一个简单的盒子过滤器聚合在一起,以制作另一张完全相同大小的图像,但成本总和超过了一个 3x3 或 5x5 的窗口。这种平滑使结果更加“稳健”。当我使用 asPtr 访问时,我正在索引这个聚合成本图像。

此外,为了节省不必要的计算,我一直在以掩码半径偏移的行开始和结束。这个掩码半径是我的人口普查掩码的半径。我可以做一些花哨的边界反射,但它更简单更快,只是为了不打扰这个边界的差异。这当然也适用于开始和结束列,但是当我强制我的整个算法只在列是 16 的倍数(例如 QVGA:320x240)的图像上运行时,在这里搞乱索引并不好,这样我就可以简单地索引并使用 SIMD 命中所有内容(无残留标量处理)。

此外,如果您认为我的代码一团糟,我鼓励您查看高度优化的 OpenCV 立体算法。我发现它们是不可能的,并且几乎没有使用它们。

我的代码编译但在运行时失败。我正在使用 VS 2012 Express Update 4。当我使用调试器运行时,我无法获得任何见解。我对使用内在函数相对较新,所以我不确定调试时应该看到哪些信息、寄存器数量、__m256i 变量是否应该可见等。

听从下面的评论建议,我通过使用更智能的索引将标量时间从 ~14 提高到 ~8。我的 CPU 是 i7-4980HQ,我在同一个文件的其他地方成功使用了 AVX2 内部函数。

信息图片

0 投票
2 回答
1460 浏览

c++ - __m256i 向量的随机元素

我想洗牌 __m256i 向量的元素。并且有一个内在的 _mm256_shuffle_epi8 做类似的事情,但它不执行跨车道洗牌。

如何使用 AVX2 指令来做到这一点?

0 投票
0 回答
3057 浏览

c++ - CMake:在 Visual Studio 2013 项目中启用“/arch:AVX2”

我正在尝试在我的 Visual Studio 2013 项目上通过 CMake 启用 AVX2 代码生成,到目前为止,我很不走运。

我尝试过的事情是:

  1. 设置CMAKE_CXX_FLAGS_*为包括/arch:AVX2如下:SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:AVX2")
  2. 像这样设置目标属性:SET_TARGET_PROPERTIES("myproject" PROPERTIES COMPILE_FLAGS "/arch:AVX2"). 我还尝试用COMPILE_FLAGS, COMPILE_DEFINITIONSCOMPILE_FEATURES无法生成项目)和COMPILE_OPTIONS.

每次我尝试生成项目时,我都会确保删除 CMake 缓存,以免它妨碍生成项目文件。

我错过了什么?任何有助于阐明这一点的帮助将不胜感激。谢谢你的时间。