将 pd (4 double) 预取到 __m256d 寄存器中
prefetching pd (4 double) into __m256d register
我想使用 AVX 预取一些数据。我正在检查 Intel IntrisicsGuide (https://software.intel.com/sites/landingpage/IntrinsicsGuide/),但只有 _mm_prefetch(...) 用于 SSE。有谁知道 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 来做到这一点?
我认为 "how i could do it using __m256d registers and pd respectively?" 的字面答案应该是这样的:
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
}
适当地将“_ps”更改为“_pd”,将“128”更改为“256”,并将“4”更改为“8”。不过,鉴于您消耗数据的速度是原来的两倍,预取步幅可能需要稍微调整一下,但这是一种黑色艺术,最好通过基准测试来完成...
我想使用 AVX 预取一些数据。我正在检查 Intel IntrisicsGuide (https://software.intel.com/sites/landingpage/IntrinsicsGuide/),但只有 _mm_prefetch(...) 用于 SSE。有谁知道 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 来做到这一点?
我认为 "how i could do it using __m256d registers and pd respectively?" 的字面答案应该是这样的:
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
}
适当地将“_ps”更改为“_pd”,将“128”更改为“256”,并将“4”更改为“8”。不过,鉴于您消耗数据的速度是原来的两倍,预取步幅可能需要稍微调整一下,但这是一种黑色艺术,最好通过基准测试来完成...