SVML __m256d _mm256_log2_pd (__m256d a)在除Intel以外的其他編譯器上不可用,他們說它的性能在AMD處理器上受到限制。g ++-4.8中缺少 Internet上AVX日志內在函數(_mm256_log_ps)中引用的某些實現嗎?和用于SSE和AVX的SIMD數學庫,但是它們似乎比AVX2的SSE更多。還有一個Agner Fog的向量庫,但是它是一個大型庫,其中包含的內容遠遠超過了向量log2,因此從實現中很難僅找出向量log2操作的基本部分。那么有人能解釋一下如何有效地log2()對4個double數字的向量進行運算嗎?也就是說,它很喜歡__m256d _mm256_log2_pd (__m256d a),但是可用于其他編譯器,并且對于AMD和Intel處理器都相當有效。編輯:在我當前的特定情況下,數字的概率在0到1之間,對數用于熵計算:所有i的和取反P[i]*log(P[i])。的浮點指數范圍P[i]很大,因此數字可以接近0。我不確定精度,因此會考慮以30個尾數開頭的任何解決方案,尤其是可調整的解決方案是首選。EDIT2:這是到目前為止我的實現,基于https://en.wikipedia.org/wiki/Logarithm#Power_series的 “更有效的系列” 。如何改善?(同時需要提高性能和準確性)到目前為止,我的實現每秒可以執行405 268 490次操作,而且直到第8位數字為止似乎都很精確。使用以下功能衡量性能:#include <chrono>#include <cmath>#include <cstdio>#include <immintrin.h>// ... Log2() implementation hereconst int64_t cnLogs = 100 * 1000 * 1000;void BenchmarkLog2Vect() { __m256d sums = _mm256_setzero_pd(); auto start = std::chrono::high_resolution_clock::now(); for (int64_t i = 1; i <= cnLogs; i += 4) { const __m256d x = _mm256_set_pd(double(i+3), double(i+2), double(i+1), double(i)); const __m256d logs = Log2(x); sums = _mm256_add_pd(sums, logs); } auto elapsed = std::chrono::high_resolution_clock::now() - start; double nSec = 1e-6 * std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count(); double sum = sums.m256d_f64[0] + sums.m256d_f64[1] + sums.m256d_f64[2] + sums.m256d_f64[3]; printf("Vect Log2: %.3lf Ops/sec calculated %.3lf\n", cnLogs / nSec, sum);}與C ++和匯編語言中對數的結果相比,當前向量實現的速度是C + +的 4倍std::log2()和2.5倍std::log()。
- 3 回答
- 0 關注
- 741 瀏覽
添加回答
舉報
0/150
提交
取消