【发布时间】:2021-08-29 01:55:47
【问题描述】:
我无法确定需要使用_mm256_maskload_ps 设置哪些位进行屏蔽。
documentation 声明掩码是“根据掩码寄存器的每个双字的最高有效位计算的整数值”
解析出来,我认为有 4 个 64 位整数。我想屏蔽 8 个值,因此我可以将其视为 8 个 32 位整数(这是我的理解变得不稳定的地方),每个整数都有一个为符号保留的 MSB,1 为负数,0 为正数。所以我可以为 8 个 32 位整数设置 -1 为“请加载这个”和 0 为“不要加载这个”,我的掩码应该是正确的。但是,我们实际上有 4 个 64 位整数,所以也许我必须打包它们?
基本上我正在寻找一种方法来描述一个掩码,以便在我这样做时设置第一个元素中的 1,2,3...8 个_mm256_maskload_ps
注意:
有趣的是,当我的掩码为{-1, 0, 0, 0} 时,前两个元素被设置。当我的掩码是{0xFFFFFFFF, 0, 0, 0} 时,只有第一个元素被设置。
#include <iostream>
#include <immintrin.h>
#include <string>
using namespace std;
int main()
{
float a[3] {1,2,3};
float b[3] {11, 22, 33};
auto disp = [](float *arr) {
cout << "[";
string sep;
for (size_t i = 0; i < 3; i++)
{
cout << sep << arr[i];
sep = ", ";
}
cout << "]";
cout << endl;
};
disp(a);
disp(b);
__m256 _a, _b;
__m256i _load_mask = {-1, 0, 0, 0};
_a = _mm256_maskload_ps(a, _load_mask);
_b = _mm256_maskload_ps(b, _load_mask);
_a = _mm256_add_ps(_a, _b);
float c[8];
_mm256_storeu_ps(c, _a);
disp(c);
return 0;
}
显示
[1, 2, 3]
[11, 22, 33]
[12, 24, 0]
编译时使用
!clang++ -mavx -Wall -Wextra -std=c++17 -stdlib=libc++ -ggdb % -o $(basename -s .cpp %
在我的 Mac 上,% 是文件名
【问题讨论】: