# 小組討論記錄 [春季班 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://i.imgur.com/llOOgZY.gif) [圖片來源](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] ~~~ * 最好的情況就是每個空間都充份利用