【发布时间】:2015-12-19 19:06:14
【问题描述】:
我试图找到 Xeon Phi 平台的 KNC 广播指令。但我找不到任何指示。相反,我尝试在程序集中使用这个 AVX _mm512_set1_epi32 内在函数。我有两个问题:首先有没有KNC广播指令?其次,当我编译下面的代码时,我得到了“vpbroadcastd”错误的操作数类型不匹配。
int op = 2;
__asm__("vmovdqa32 %0,%%zmm0\n\t"
"mov %1, %%eax\n\t"
"vpbroadcastd %%eax, %%zmm1\n\t"
"vpsravd %%zmm1,%%zmm0,%%zmm1\n\t"
"vmovdqa32 %%zmm1,%0;"
: "=m" (tt[0]): "m" (op));
其中 tt 使用以下代码定义,我使用 k1om-mpss-linux-gcc 编译器来编译此代码
int * tt = (int *) aligned_malloc(16 * sizeof(int),64);
【问题讨论】:
-
根据 Xeon Phi 指令集手册 VPBROADCASTD 仅将内存位置作为源操作数。 AVX 2 版本采用内存位置或 XMM 寄存器。两者都不允许 EAX 作为源。
-
@RossRidge 感谢您的回复。我的问题是在 Xeon Phi 指令中使用广播或设置指令的正确方法是什么?
-
@RossRidge: 常规 AVX512F 确实 允许从 GP 寄存器进行广播。 Xeon Phi没有那个吗?这将解释问题。在这种情况下,解决方案就是先不加载到 eax 中,因为 OP 会强制编译器将其放入内存中。
-
@RossRidge:Peter 建议使用 _mm512_set1_epi32(int) 内在函数。我只想知道这条指令的汇编版本。不知道r32是什么?以及如何加载到 r32?
-
我想也许你在这里咬得比你能咀嚼的还多。正如英特尔的文档所述,没有对应于
_mm512_set1_epi32的汇编指令。理想情况下,此内在函数不会生成指令,广播是使用{1to16}操作数转换免费完成的。要有效地使用 Xeon Phi 进行组装,您需要了解类似的内容。你不应该问r32的含义之类的基本问题。
标签: assembly broadcast xeon-phi