Hayır, bu garanti edilmez. Herhangi bir optimizasyon olmadan bir NETLIB BLAS kullanıyorsanız, sonuçların aynı olduğu çoğunlukla doğrudur. Ancak BLAS ve LAPACK'in herhangi bir pratik kullanımı için yüksek derecede optimize edilmiş bir paralel BLAS kullanılır. Paralelleştirme, yalnızca bir CPU'nun vektör kayıtlarında paralel olarak çalışsa bile, tek terimlerin değerlendirilme sırasının değişmesine ve toplamın sırasının da değişmesine neden olur. Şimdi sonuçların aynı olmadığı IEEE standardındaki eksik ilişkisel özellikten kaynaklanmaktadır. Yani tam olarak bahsettiğiniz şey olabilir.
NETLIB BLAS'ta skaler ürün sadece bir faktör 5 tarafından açılan bir döngü içindir:
DO I = MP1,N,5
DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1) +
$ DX(I+2)*DY(I+2) + DX(I+3)*DY(I+3) + DX(I+4)*DY(I+4)
END DO
ve her bir çarpma anında DTEMP'ye eklenirse veya 5 bileşenin tamamı önce toplanır ve sonra DTEMP'ye eklenirse derleyiciye bağlıdır. OpenBLAS'ta mimariye bağlı olarak daha karmaşık bir çekirdek var:
__asm__ __volatile__
(
"vxorpd %%ymm4, %%ymm4, %%ymm4 \n\t"
"vxorpd %%ymm5, %%ymm5, %%ymm5 \n\t"
"vxorpd %%ymm6, %%ymm6, %%ymm6 \n\t"
"vxorpd %%ymm7, %%ymm7, %%ymm7 \n\t"
".align 16 \n\t"
"1: \n\t"
"vmovups (%2,%0,8), %%ymm12 \n\t" // 2 * x
"vmovups 32(%2,%0,8), %%ymm13 \n\t" // 2 * x
"vmovups 64(%2,%0,8), %%ymm14 \n\t" // 2 * x
"vmovups 96(%2,%0,8), %%ymm15 \n\t" // 2 * x
"vmulpd (%3,%0,8), %%ymm12, %%ymm12 \n\t" // 2 * y
"vmulpd 32(%3,%0,8), %%ymm13, %%ymm13 \n\t" // 2 * y
"vmulpd 64(%3,%0,8), %%ymm14, %%ymm14 \n\t" // 2 * y
"vmulpd 96(%3,%0,8), %%ymm15, %%ymm15 \n\t" // 2 * y
"vaddpd %%ymm4 , %%ymm12, %%ymm4 \n\t" // 2 * y
"vaddpd %%ymm5 , %%ymm13, %%ymm5 \n\t" // 2 * y
"vaddpd %%ymm6 , %%ymm14, %%ymm6 \n\t" // 2 * y
"vaddpd %%ymm7 , %%ymm15, %%ymm7 \n\t" // 2 * y
"addq $16 , %0 \n\t"
"subq $16 , %1 \n\t"
"jnz 1b \n\t"
...
skaler ürünü 4 uzunluktaki küçük skaler ürünlere böler ve toplar.
ATLAS, MKL, ESSL, ... gibi diğer tipik BLAS uygulamalarını kullanarak bu sorun aynı kalır çünkü her BLAS uygulaması hızlı kod almak için farklı optimizasyonlar kullanır. Ama bildiğim kadarıyla gerçekten hatalı sonuçlara neden olmak için yapay bir örneğe ihtiyaç var.
BLAS kitaplığının aynı sonuçlar için döndürülmesi gerekiyorsa (aynı şekilde bit), aşağıdaki gibi çoğaltılabilir bir BLAS kitaplığı kullanılmalıdır: