我想使用AVX预取一些数据。我正在查看英特尔IntrisicsGuide(https://software.intel.com/sites/landingpage/IntrinsicsGuide/),但SSE只存在_mm_prefetch(...)。有谁知道AVX的解决方法?
更新19.02.15:
也许我误解了预取的目的。所以我想更详细地描述一下这个问题:
#include <x86intrin.h>
...
__m128 x0 = ...;
...
// doing some vector operations ...
for (int i=0; i<ndiv4; ++i) {
_mm_prefetch((char*) y+4*i+8, _MM_HINT_NTA ); //prefetch data fro two iteratrions later
__m128 x1 = _mm_load_ps(x+4*i); // aligned load
__m128 x2 = _mm_mul_ps(x0,x1); // x0 defined earlier
_mm_store_ps(x+4*i,x2); // store aligned back
}
(我知道在这种情况下预取可能不一定有用) 我的问题是,我是否或如何使用__m256d寄存器和pd分别做到这一点?
答案 0 :(得分:0)
我认为字面上的回答是&#34;我怎么能分别用__m256d寄存器和pd来做呢?&#34;就是这样:
for (int i=0; i<ndiv8; ++i) {
_mm_prefetch((char*) y+8*i+16, _MM_HINT_NTA ); //prefetch data fro two iteratrions later
__m256 x1 = _mm_load_pd(x+8*i); // aligned load
__m256 x2 = _mm_mul_pd(x0,x1); // x0 defined earlier
_mm_store_pd(x+8*i,x2); // store aligned back
}
改变&#34; _ps&#34; to&#34; _pd&#34;,&#34; 128&#34;到&#34; 256&#34;和&#34; 4&#34;至&#34; 8&#34;作为适当的。但是,鉴于您的数据消耗速度是原来的两倍,预取步幅可能需要稍微调整一下,但这有点像黑色艺术,这是通过基准测试最好的... < / p>