C++ error: ‘_mm_sin_ps’ was not declared in this scope
C++ error: ‘_mm_sin_ps’ was not declared in this scope
我正在尝试对将函数应用于数组的不同方法进行基准测试。
_mm_sin_ps
我的范围不知道但 _mm_sqrt_ps
是?
我如何让它为人所知?并编译无误。
#include <random>
#include <iostream>
#include <cmath>
#include <chrono>
#include <algorithm>
#include <valarray>
#include "immintrin.h"
#include <array>
int main()
{
std::cout<<"start\n";
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(-1000, 1000);
int N=100;
while(N--)
{
std::cout<<"\nN: "<<N;
const int T1=4E6;
{
int T=T1,T0=T1/4;
std::array<float,T1> array;
while(T--)
{
array[T]=dis(gen);
}
auto start_time = std::chrono::high_resolution_clock::now();
auto it =array.begin();
while(T0--)
{
__m128 X = _mm_loadu_ps(it);
__m128 result = _mm_sin_ps(X);
_mm_storeu_ps(it, result);
it+=4;
}
auto time2=std::chrono::high_resolution_clock::now()-start_time;
std::cout<<"\nintr1: "<<std::chrono::duration_cast<std::chrono::microseconds>(time2).count();
}
}
std::cout<<"\nfin\n";
return 0;
}
编译器
g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable- plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
_mm_sin_ps
是 SVML 库的一部分,仅随英特尔编译器一起提供。 GCC 开发人员专注于包装机器指令和简单任务,因此目前 immintrin.h
中还没有 SVML。
你必须使用库或自己编写。
正弦实施:
如前所述,您正在尝试使用英特尔的 SVML 库。
然而,免费开源 sse_mathfun
库中有几个 SIMD 超越函数。仅使用 SSE2 的原始版本在这里:http://gruntthepeon.free.fr/ssemath/ but there's a more up-to-date version here which has been updated for SSE3/SSE4 here: https://github.com/RJVB/sse_mathfun
你想要的函数叫做sin_ps
:
v4sf sin_ps(v4sf x);
其中 v4sf
只是 __m128
.
的类型定义
原来的sse_mathfun
也有cos_ps
、log_ps
和exp_ps
,较新的(RJVB)版本有一些单精度和双精度的附加函数。
我已经成功地将这个库的两个版本与 gcc、clang 和 Intel 的 ICC 一起使用(后者有一些小的 mod)。
__mm_sin_ps 是调用 SVML 库的内在函数(已经提到)。
在 GCC 中,SVML 作为 libmvec 的一部分提供
在 glibc 中。
函数根据 Vector ABI 命名,如上文 link 所述。 Sin、cos、exp、sincos、log、pow 函数可用。
这是 __m128 的示例:
#include <x86intrin.h>
#include <stdio.h>
typedef union
{
__m128 x;
float a[4];
} union128;
__m128 _ZGVbN4v_sinf_sse4(__m128);
void main()
{
union128 s1, res;
s1.x = _mm_set_ps (0, 0.523599, 1.0472 , 1.5708);
res.x =_ZGVbN4v_sinf_sse4(s1.x);
fprintf(stderr, "%f %f %f %f\n", res.a[0], res.a[1], res.a[2], res.a[3]);
}
有什么理由,为什么内部函数比直接使用 SVML 函数更好?
我正在尝试对将函数应用于数组的不同方法进行基准测试。
_mm_sin_ps
我的范围不知道但 _mm_sqrt_ps
是?
我如何让它为人所知?并编译无误。
#include <random>
#include <iostream>
#include <cmath>
#include <chrono>
#include <algorithm>
#include <valarray>
#include "immintrin.h"
#include <array>
int main()
{
std::cout<<"start\n";
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(-1000, 1000);
int N=100;
while(N--)
{
std::cout<<"\nN: "<<N;
const int T1=4E6;
{
int T=T1,T0=T1/4;
std::array<float,T1> array;
while(T--)
{
array[T]=dis(gen);
}
auto start_time = std::chrono::high_resolution_clock::now();
auto it =array.begin();
while(T0--)
{
__m128 X = _mm_loadu_ps(it);
__m128 result = _mm_sin_ps(X);
_mm_storeu_ps(it, result);
it+=4;
}
auto time2=std::chrono::high_resolution_clock::now()-start_time;
std::cout<<"\nintr1: "<<std::chrono::duration_cast<std::chrono::microseconds>(time2).count();
}
}
std::cout<<"\nfin\n";
return 0;
}
编译器
g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable- plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
_mm_sin_ps
是 SVML 库的一部分,仅随英特尔编译器一起提供。 GCC 开发人员专注于包装机器指令和简单任务,因此目前 immintrin.h
中还没有 SVML。
你必须使用库或自己编写。 正弦实施:
如前所述,您正在尝试使用英特尔的 SVML 库。
然而,免费开源 sse_mathfun
库中有几个 SIMD 超越函数。仅使用 SSE2 的原始版本在这里:http://gruntthepeon.free.fr/ssemath/ but there's a more up-to-date version here which has been updated for SSE3/SSE4 here: https://github.com/RJVB/sse_mathfun
你想要的函数叫做sin_ps
:
v4sf sin_ps(v4sf x);
其中 v4sf
只是 __m128
.
原来的sse_mathfun
也有cos_ps
、log_ps
和exp_ps
,较新的(RJVB)版本有一些单精度和双精度的附加函数。
我已经成功地将这个库的两个版本与 gcc、clang 和 Intel 的 ICC 一起使用(后者有一些小的 mod)。
__mm_sin_ps 是调用 SVML 库的内在函数(已经提到)。
在 GCC 中,SVML 作为 libmvec 的一部分提供 在 glibc 中。
函数根据 Vector ABI 命名,如上文 link 所述。 Sin、cos、exp、sincos、log、pow 函数可用。 这是 __m128 的示例:
#include <x86intrin.h>
#include <stdio.h>
typedef union
{
__m128 x;
float a[4];
} union128;
__m128 _ZGVbN4v_sinf_sse4(__m128);
void main()
{
union128 s1, res;
s1.x = _mm_set_ps (0, 0.523599, 1.0472 , 1.5708);
res.x =_ZGVbN4v_sinf_sse4(s1.x);
fprintf(stderr, "%f %f %f %f\n", res.a[0], res.a[1], res.a[2], res.a[3]);
}
有什么理由,为什么内部函数比直接使用 SVML 函数更好?