在 Xeon Phi 上为双打操作面具

Posted

技术标签:

【中文标题】在 Xeon Phi 上为双打操作面具【英文标题】:Manipulating Masks for doubles on Xeon Phi 【发布时间】:2013-09-11 13:40:14 【问题描述】:

我正在使用内部函数在 Xeon Phi 上进行条件计算。 我必须使用双精度值,所以我需要一个 __mmask8。 只要我使用一些比较函数对我来说没有问题,但是如果我想修改这些掩码,我会遇到一些类型冲突。 documentation 为我提供了很多修改用于单精度的 __mmask16 的功能,但没有一个可用于双精度。

我想做如下的事情:

int tmp = 0;
for(i = 0; i < 8; i++)  
    tmp = index[i];
    tmp = tmp << 1;

__mmask8 something = _mm512_int2mask(tmp);

文档只为 __mmask16 提供了给定的函数。 文档的Vector Mask Intrinsic chapter 中的所有操作函数也是如此。

我也可以使用这些功能吗?

是否有类似“使用 __mmask16 的每一秒位”这样的约定?

提前致谢

【问题讨论】:

【参考方案1】:

根据http://software.intel.com/en-us/articles/intel-xeon-phi-coprocessor-vector-microarchitecture

每个 VPU 有 128 个入口 512 位向量寄存器,分布在 线程,因此每个线程获得 32 个条目。这些都是 硬分区。每个线程有 8 个 16 位掩码寄存器 它们是向量寄存器文件的一部分。掩码寄存器充当 每个元素一个过滤器,用于 16 个元素,因此允许一个 控制 16 个 32 位元素中的哪一个在 计算。 对于双精度,掩码位是低 8 位。

英特尔不提供任何内在函数来操作 __mmask8 类型;所有内在函数都用于 __mmask16。因此,我假设我们应该只使用 __mmask16 内部函数来操作 __mask8 类型。这似乎可行,但到目前为止我对这些的经验很少。

【讨论】:

刚刚有时间对此进行全面测试。你的建议是完全正确的。给更多读者的一个附加信息:在 __mmask8 中,其他位被丢弃,因此转换回 __mmask16 仅包含 __mmask8 使用的 8 位

以上是关于在 Xeon Phi 上为双打操作面具的主要内容,如果未能解决你的问题,请参考以下文章

我可以通过 Interop 使用 C++ dll 卸载到 Xeon Phi 吗?

在 xeon-phi 上引导自定义内核

Xeon-Phi 从主机 openMP 并行区域异步卸载

无法解释的 Xeon-Phi 开销

如何检测 Xeon Phi (Knights Landing)

关于 Xeon Phi 的 SCIF 问题