Я попробовал следующий код:
Код: Выделить всё
#include
#include
float dot(__m128 a,__m128 b) {
__m128 tmp = _mm_mul_ps(a,b);
tmp = _mm_hadd_ps(tmp,tmp);
return _mm_cvtss_f32(_mm_hadd_ps(tmp,tmp));
}
template struct v_span {
T *data;
operator __m128() const {
if constexpr(Stride == 1) {
return _mm_load_ps(data);
} else {
return _mm_set_ps(data[0],data[Stride],data[Stride*2],data[Stride*3]);
}
}
T &operator[](int i) const { return data[i*Stride]; }
};
template struct m_span {
T *data;
auto row(int i) const { return v_span{data + i*4}; }
auto col(int i) const { return v_span{data + i}; }
};
void multiply1(m_span out, m_span a, m_span b) {
for(int c=0; c
Подробнее здесь: [url]https://stackoverflow.com/questions/78684749/how-to-tell-msvc-that-a-pointer-inside-a-struct-does-not-alias-another-pointer-i[/url]