E adevărat că acum parcă și Java are SIMD, dar în C++ cu ajutorul templates (și cum funcționează ele, pentru că funcționează diferit față de generics din Java/C#) se pot face mai multe optimizări non-triviale, așa cum se explică și aici. De acolo:
auto A1 = Matrix<N, N>{ /* ... */ };
auto A2 = Matrix<N, N>{ /* ... */ };
/* ... */
auto An = Matrix<N, N>{ /* ... */ };
auto sum = A1 + A2 + ... + An; // nu va apărea niciun temporar
// Nu calculează rezultatul direct, ci convertește expresia lazily la un fel de arbore de operații, ceva de genul:
Glue<Glue<...Glue<Glue<A1, A2, op_plus>, A3, op_plus>..., An, op_plus>;
// Iarăși pentru înmulțire:
auto A = Matrix<60, 5>{ /* ... */ };
auto B = Matrix<5, 30>{ /* ... */ };
auto C = Matrix<30, 10> { /* ... */ };
auto product = A * B * C;
// Un algoritm naiv va efectua 27.000 de operații: (A * B) * C
// Cu template expressions se poate decide la compile-time care e ordinea înmulțirii mai eficientă (înmulțirea matricilor fiind asociativă)
// A * (B * C) ar însemna doar 4.000 de operații
// Și nici 4000 nu cred că efectuează, am impresia că optimizează și mai mult algoritmul de înmulțire pe matrici
Optimizările de genul sunt la un nivel mai înalt decât SIMD, iar în Java/C# e mult mai greu spre imposibil să ajungi la asta (adică să fie atât de easily-readable dar în același timp cu aceste optimizări). C++ o fi nașpa, dar dacă se potrivește la ceva, se potrivește la software matematic (IMO). Nici în Rust (care are const generics acum) nu cred că se poate ajunge la nivelul ăsta de template expressions, poate doar cu macros care nu prea au cum să facă codul atât de readable.
Nu stiu daca s-au mai gasit modalitati mai bune de a face asta, dar imi amintesc de o implementare faina cu arbori de la Nvidia.
Pentru un array cu cateva miliarde de valori, rezultatul era de vreo 10x mai rapid pe GPU versus la vremea aia pe un Xeon.
Presupun ca e cel mai important algoritm momentan, deoarece se aplica la integrale samd. Problema cea mai mare era ca pierdea din acuratete destul de mult fara sa te joci putin cu pierderile, chiar sunt curios daca s-a rezolvat problema asta.