c++ - 使用 AVX2 C++ 的选择性加载
问题描述
我正在尝试使用 AVX2 实现以下目标,但花了半天时间却无法做到。我尝试使用 maskload 和其他东西,但未能解决问题。
我有两个双精度数组 a 和 b。
double a[] = {-1000.00, 0.00, 2000.00, 3500.00};
double b[] = {1.25, 1.636, -2.50, 3.25};
我只想将那些值加载b
到__m256d
其中对应的值a
非零的a中,否则将其设置为0。
就像是:
double c[4];
for(int i=0; i<4; ++i)
{
if a[i] == 0
c[i] = 0;
else
c[i] = b[i];
}
有人可以帮忙吗?
编辑:这是一个更大问题的一部分,不只有 4 个值,因此我不想像这里一样计算另一个数组并将该数组加载到寄存器中。
解决方案
由于b
可以无条件加载 的条目,因此可以使用掩码将应清零的条目清零:
__m256d zero = _mm256_setzero_pd();
__m256d c = _mm256_and_pd(b, _mm256_cmp_pd(zero, a, _CMP_NEQ_UQ));
使用_CMP_NEQ_UQ
意味着 NaN ina
不会将条目归零,而同时使用_CMP_NEQ_OQ
零和 NaN 会将条目归零。
推荐阅读
- javascript - dispatchEvent 在 Internet Explorer 11 的 javascript 中不起作用
- sql - 如何在 Flask 应用程序中将可变参数插入 SQL 存储过程
- javascript - JavaScript,对象变量被声明为 NaN 的问题
- c++ - 通过包装器从 C 访问 C++ API 时,如何访问枚举类型?
- mysql - 如何使用 & 符号在 MYSQL 数据库中设置枚举值?
- java - 基本整数枚举
- android - 在流中使用 Android 上的 ViewModel 进行状态管理
- c++ - 在 AtMega32a 上运行的 C++ 单元测试
- android - 如何在使用 galio 做出本机反应时更改 Like 按钮的颜色
- python - 如何旋转表格并获取 Python 中每一行的百分比?