亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教如何在AVX2中高效實現log2(__ m256d)

請教如何在AVX2中高效實現log2(__ m256d)

C++
largeQ 2019-12-31 01:00:59
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 回答

  • 3 回答
  • 0 關注
  • 741 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號