c - 从C中的两个ymms填充一个zmm
问题描述
我想知道从两个 m256is 加载 m512i 的最佳方法是什么,简单打包 (zmm0 = {ymm1,ymm0})。我知道 ymm0 是 zmm0 的低位,但不确定我是否可以使用内在函数在 C 中利用它。在 C 中实现这一目标的最佳方法是什么?
解决方案
_mm256_set_m128i
奇怪的是,英特尔的内在函数指南中似乎没有 256->512 版本。也许是因为每个 AVX512 内在函数都必须有一个_mask_
版本?不,还有_mm512_set_epi32
,所以这很奇怪。
你可以_mm512_cast
一来__m512i
二vinserti32x8
去。(或 64x4,如果不屏蔽,则选择无关紧要。)
#include <immintrin.h>
__m256i merge256(__m128i lo, __m128i hi){
//return _mm256_set_m128i(hi, lo);
return _mm256_set_m128i(hi, lo);
}
#ifdef __AVX512F__
__m512i merge512(__m256i lo, __m256i hi){
__m512i base = _mm512_castsi256_si512(lo); // upper half is don't-care
return _mm512_inserti32x8(base, hi, 1); // insert hi as new upper half
// return _mm512_set_m256i(b, a); // doesn't exist in GCC, clang, ICC, or MSVC
}
#endif
Godbolt 上的演示,还包括 128->256 和_mm256_set_m128i(hi, lo)
对于这些示例,我将 arg 顺序定义为 lo, hi。您可能更愿意将其定义为 hi, lo 以匹配_mm_set
(而不是setr
)内在函数。
推荐阅读
- mysql - 如何使用 MySQL Group Concat
- apache-spark - pySpark.sql 如何使用 WHERE 关键字?
- anaconda - Jupyter Notebook 未连接到 python 内核
- excel - 用于将 Chartsheets 打印到 PDF 的 VBA 宏以奇怪的比例生成截止图表
- google-apps-script - 我有一段代码有效,但效率很低。它可能可以改进,但我不明白“return”是如何工作的
- php - SOAP 响应。如何处理?
- php - 如何使用会话变量实现访问控制系统?
- javascript - 重新排列音频节点时是否保证无缝播放?
- r - R - List 中的 DataFrame 不展开某些列
- r - R从重复文本中提取数据到数据框