【发布时间】:2017-11-21 15:39:09
【问题描述】:
我正在尝试使用英特尔 FMA 内在函数,例如 _mm_fmadd_ps (__m128 a, __m128 b, __m128 c),以便在我的代码中获得更好的性能。
所以,首先,我做了一个小测试程序,看看它可以做什么以及如何使用它们。
#include <stdio.h>
#include <stdlib.h>
#include "xmmintrin.h"
int main()
{
__m128 v1,v2,v3,vr;
v1 = _mm_set_ps (5.0, 5.0, 5.0, 5.0);
v2 = _mm_set_ps (2.0, 2.0, 2.0, 2.0);
v3 = _mm_set_ps (3.0, 3.0, 3.0, 3.0);
vr = _mm_fmadd_ps (v1, v2, v3);
}
我遇到了这个错误:
vr = 错误:从类型“int”分配给类型“__m128”时类型不兼容 vr = _mm_fmadd_ps (v1, v2, v3);
我认为可能是处理器功能不允许使用此类指令,所以我在互联网上查找了我的处理器型号 (Intel® Core™ i7-4700MQ Processor),发现它仅支持 SSE4.1/4.2 , AVX 2.0 内在函数对我来说有点奇怪!! 所以我查看了 proc/cpuinfo 文件和 flags 部分,我找到了 ** fma ** 标志。这是硬件方面令人困惑的部分。
至于软件,在互联网上进行了一些挖掘后,我使用了这个 makefile 选项,我希望这不是问题。
CC=gcc
CFLAGS=-g -c -Wall -O2 -mavx2 -mfma
我在 Ubuntu 12.04 LTS 上使用 Eclipse,GCC 版本为 4.9.4 谢谢。
【问题讨论】:
-
这是一个编译器错误。代码还没有开始运行,所以不可能是你的芯片没有支持。
-
@PaulR : 成功了....谢谢
-
请注意,这段代码没有任何用处,因此当您在启用优化的情况下编译它 (
-O2) 时,编译器会忽略所有这些代码并简单地发出代码以从main(@987654323) 返回 0 @)。所以它会真正快速运行。 :-) -
标签: c x86 simd intrinsics fma