簡體   English   中英

帶矩陣乘法的sse精度誤差

[英]sse precision error with Matrix multiplication

我的程序執行NxN個矩陣乘法,其中兩個矩陣的元素都使用for循環初始化為值(0,1,2,... N)。 兩個矩陣元素均為float類型。 沒有內存分配問題。 輸入的矩陣大小為4的倍數,例如:4x4或8x8等。答案通過順序計算進行驗證。 一切正常,直到矩陣大小為64x64。 僅當矩陣大小超過64(例如:68 x 68)時,才能觀察到順序版本和SSE版本之間的差異。

SSE代碼段如下所示(大小= 68):

void matrix_mult_sse(int size, float *mat1_in, float *mat2_in, float *ans_out) { __m128 a_line, b_line, r_line; int i, j, k; for (k = 0; k < size * size; k += size) { for (i = 0; i < size; i += 4) { j = 0; b_line = _mm_load_ps(&mat2_in[i]); a_line = _mm_set1_ps(mat1_in[j + k]); r_line = _mm_mul_ps(a_line, b_line); for (j = 1; j < size; j++) { b_line = _mm_load_ps(&mat2_in[j * size + i]); a_line = _mm_set1_ps(mat1_in[j + k]); r_line = _mm_add_ps(_mm_mul_ps(a_line, b_line), r_line); } _mm_store_ps(&ans_out[i + k], r_line); } } }

這樣,答案在元素3673上有所不同,在這里我得到乘法的答案如下

標量 :576030144.000000& SSE :576030208.000000

我還用相同的初始化和設置用Java編寫了一個類似的程序,N = 68,對於元素3673,我得到的答案為576030210.000000。

現在有三個不同的答案,我不確定如何繼續。 為什么會出現這種差異?如何消除這種差異?

我正在總結討論,以結束已回答的問題。

所以根據文章(什么每台計算機科學家應該知道關於浮點運算)的鏈接 ,浮點總是導致一個舍入誤差是的浮點數的近似表示性質的直接后果。

諸如加,減之類的算術運算會導致精度誤差。 因此,浮點答案的6個最高有效數字 (無論小數點位於何處)都可以被認為是准確的,而其他數字則可能是錯誤的(容易出現精度錯誤)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM