# 小組討論記錄
[春季班 Raytracing 討論](https://hackmd.io/s/HkifAKiae#)
* 原本經由 SSE 改善效能,發現用 2 組 128 bit 表達 3 個 double 很浪費空間
* 後來 AVX 在效果上如果能像 normalize 或 length 可以有效利用空間
* 像 dot_product 裏面,有空下 2 到 3 個的空間數量較高,效果就不好
~~~ c=
static inline
double dot_product(const double *v1, const double *v2)
{
double temp[4] = {0, 0, 0, 0};
__m256d ymm0, ymm1;
ymm0 = _mm256_loadu_pd (v1); // ymm0 = {a0, a1, a2,X}
ymm1 = _mm256_loadu_pd (v2); // ymm1 = {b0, b1, b2, X}
ymm0 = _mm256_mul_pd (ymm0, ymm1); // ymm0 = {a0*b0, a1*b1, a2*b2, X}
const __m128d valupper = _mm256_extractf128_pd(ymm0, 1); // valupper = {a2*b2, X}
ymm1 = _mm256_castpd128_pd256 (valupper); // ymm2 = {a2*b2, X, X, X}
ymm0 = _mm256_hadd_pd (ymm0, ymm0); // ymm0 = {a0*b0+a1*b1, X, X, X}
ymm0 = _mm256_add_pd (ymm0, ymm1); // ymm0 = {a0*b0+a1*b1+a2*b2, X, X, X}
_mm256_storeu_pd (temp, ymm0);
return *temp;
}
~~~
* 所以重點在於空間的使用
* 往 [AOS and SOA](https://en.wikipedia.org/wiki/AOS_and_SOA) 的方向考慮
* 但還是會使用AVX 一次操作 4 個 double 如果善加利用空間一定會比 SSE 佳
* 目前想法 : 
[圖片來源](https://software.intel.com/en-us/articles/ticker-tape-part-2)
* 拿 dot_product(這個呼叫最多次的程式來說) 如果可以重新整理成:
~~~
[X1,X2,X3,X4]
[Y1,Y2,Y3,Y4]
[Z1,Z2,Z3,Z4]
| 計算 |
result [R1,R2,R3,R4]
~~~
* 最好的情況就是每個空間都充份利用