2014-09-19 55 views
4

我使用SSE類型(如__m128(在xmmintrin.h等中定義))做了一些明確的向量化計算,但現在我需要將向量的所有元素都提升爲一些(相同)功率,即理想情況下我想像__m128 _mm_pow_ps(__m128, float),這不幸不存在。對於SSE類型的功能

這是最好的方法是什麼?我可以存儲矢量,在每個元素上調用std::pow,然後重新加載它。這是我能做的最好的嗎?自動矢量化代碼時,編譯器如何實現對std::pow的調用?有沒有提供有用的東西的庫?

(注意:this question是不是重複相關的,當然沒有一個有用的答案。)

+0

我用http://gruntthepeon.free.fr/ ssemath/for'exp/log'並且在自動矢量化不是一個選項時寫'pow(x,k)'爲'exp(k * log(x)'。不知道它與自動矢量化代碼的比較。 – SleuthEye 2014-09-19 14:47:23

+2

你可以使用Agner Fog的矢量類,他具有SSE,AVX和AVX512的SIMD數學函數(包括pow,exp,log,sin,...)並浮動和整數。我認爲沒有任何理由使用英特爾的SVML或AMD的libm了。 – 2014-09-20 15:01:02

+0

@Zboson,是否有一個很好的支持SSE4的'exp()'的C庫? – Royi 2017-10-30 19:00:09

回答

7

使用公式exp(y*log(x))pow(x, y)a library用exp和日誌SSE實現。

+0

爲圖書館+1,先前不知道 – legends2k 2014-09-19 15:06:48

+0

我看了一下那個圖書館。它看起來僅限於gcc,只知道SSE2,代碼中的文檔很差。我也希望它可以用於AVX類型'__m256' __m256d'。 – Walter 2014-09-19 15:11:21

+0

@Walter可以很好地處理MSVC(注意鏈接底部的VS2010基準),並且在查看[cephes庫](http://www.netlib.org/cephes/cmath.tgz)時代碼變得更加清晰似乎是主要的靈感。 – SleuthEye 2014-09-20 00:21:01

2

我真的很推薦這些類型的操作的英特爾短矢量數學庫。該庫與您在要支持的編譯器列表中提到的英特爾編譯器捆綁在一起。我懷疑它對於gcc和clang會有用,但它可以作爲您在哪裏實現pow的實現進行基準測試的參考點。

https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-DEB8B19C-E7A2-432A-85E4-D5648250188E.htm

+1

SVML可以用於gcc。 'gcc -mveclibabi = svml'甚至會讓矢量器創建對vmlsPow4等的調用。 – 2015-04-11 06:27:21

+0

@MarcGlisse,'gcc'包含內建的Intel SVML嗎? – Royi 2017-10-30 18:30:45

+0

gcc不包含SVML,它只具有如何生成對它的調用的知識,如果你承諾你將它用於鏈接。 – 2017-10-30 18:33:38

-1

辨認出浮體的載體。

_mm_pow_ps(v,_mm_ps1(f)) 
+1

恐怕沒有'_mm_pow_ps()'。否則,我沒有問過。 – Walter 2015-04-10 11:47:19

+0

啊,我誤解了這個問題。泰勒系列是傳統的,如前所述http://gruntthepeon.free.fr/ssemath/是一個很好的資源。根據精度的重要性,可以使術語數量更低。 – 2015-04-12 23:18:01

1
的ssemath庫

的AVX版本現已推出:http://software-lisc.fbk.eu/avx_mathfun/

與庫可以使用:

exp256_ps(y*log256_ps(x)); // for pow(x, y) 
+0

是的,這些爲使用AVX的8個浮子提供了log,exp,sin,cos和sincos函數。不幸的是,相應的「雙」版本仍然非常出色(我現在實際上更需要這些)。 – Walter 2017-03-29 19:50:18

+0

你可以試試Intel SPMD編譯器:http://ispc.github.io/ispc.html文檔說它支持pow和AVX – Pietro 2017-03-31 07:35:44