Very poor `gemmt` performance compared to `gemm` and `syrk`
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 38/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Área
- performance
Línea de trabajo
La reproducción compara cblas_dgemmt con cblas_dsyrk y cblas_dgemm para una matriz row-major de 1,000,000 x 32; empieza perfilando o trazando la ruta de llamada de gemmt en OpenBLAS y comparando su trabajo con esas alternativas. Se considera terminado cuando se haya abordado la diferencia de rendimiento informada y los resultados equivalentes sigan siendo correctos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
I'm running some timings on operation t(X)*X on row-major matrices having many more rows than columns.
I'm finding that for these types of inputs, function gemmt is much slower than the equivalent from syrk or gemm, with a very wide margin.
Timings in milliseconds for input size 1,000,000 x 32, intel i12700H, average of 3 runs:
gemmt: 216.178syrk: 41.0468gemm: 39.55553
Version: OpenBLAS 0.3.28, built with OpenMP, compiled from source (gcc with cmake system). Same issue happen with pthreads, and same timing difference is observed when running single-threaded.
For reference, timings for other libraries:
- MKL
gemmt: 25.66533 - MKL
syrk: 12.57197 - MKL
gemm: 15.69447 tabmat's "sandwich" op: 29.3
Code to reproduce:
#include <iostream>
#include <chrono>
#include <random>
#include <memory>
#include <cblas.h>
extern "C" void cblas_dgemmt(const CBLAS_LAYOUT Layout, const CBLAS_UPLO uplo, const CBLAS_TRANSPOSE transa, const CBLAS_TRANSPOSE transb, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc);
using std::chrono::high_resolution_clock;
using std::chrono::duration_cast;
using std::chrono::duration;
using std::chrono::milliseconds;
int main()
{
const size_t nrows = 1'000'000;
const size_t ncols = 32;
const size_t tot = nrows * ncols;
std::mt19937 rng{123};
std::normal_distribution norm_distr{0.0, 1.0};
std::unique_ptr<double[]> X(new double[tot]);
std::unique_ptr<double[]> out(new double[ncols*ncols]());
for (size_t ix = 0; ix < tot; ix++) X[ix] = norm_distr(rng);
auto t1 = high_resolution_clock::now();
cblas_dgemmt(
CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans,
ncols, nrows,
1., X.get(), ncols,
X.get(), ncols,
0., out.get(), ncols
);
auto t2 = high_resolution_clock::now();
duration<double, std::milli> ms_double = t2 - t1;
double sum_res = 0.;
for (size_t ix = 0; ix < ncols*ncols; ix++) sum_res += out[ix];
std::cout << "time gemmt:" << ms_double.count() << std::endl;
std::cout << "sum gemmt:" << sum_res << std::endl;
t1 = high_resolution_clock::now();
cblas_dsyrk(
CblasRowMajor, CblasUpper, CblasTrans,
ncols, nrows,
1., X.get(), ncols,
0., out.get(), ncols
);
t2 = high_resolution_clock::now();
ms_double = t2 - t1;
sum_res = 0.;
for (size_t ix = 0; ix < ncols*ncols; ix++) sum_res += out[ix];
std::cout << "time syrk:" << ms_double.count() << std::endl;
std::cout << "sum syrk:" << sum_res << std::endl;
t1 = high_resolution_clock::now();
cblas_dgemm(
CblasRowMajor, CblasTrans, CblasNoTrans,
ncols, ncols, nrows,
1., X.get(), ncols,
X.get(), ncols,
0., out.get(), ncols
);
t2 = high_resolution_clock::now();
ms_double = t2 - t1;
sum_res = 0.;
for (size_t ix = 0; ix < ncols*ncols; ix++) sum_res += out[ix];
std::cout << "time gemm:" << ms_double.count() << std::endl;
std::cout << "sum gemm:" << sum_res << std::endl;
return 0;
}
- Lenguaje dominante
- C
- Estrellas
- 7.6k
- Forks
- 1.7k
- Merge medio
- 1 d 3 h
- PR fusionados (30 d)
- 42
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de OpenMathLib/OpenBLAS
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
OpenMathLib/OpenBLAS#6029 · 21 comentarios ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
OpenMathLib/OpenBLAS#6028 · 1 comentario ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
OpenMathLib/OpenBLAS#6005 · 21 comentarios · 2 reacciones ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
OpenMathLib/OpenBLAS#5930 · 2 comentarios ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
OpenMathLib/OpenBLAS#5870 · 4 comentarios ·
Todos los issues de OpenMathLib/OpenBLAS
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
zephyrproject-rtos/zephyr#119726 ·
-
[Bounty proposal] fix(web): memory insights count an evening memory on the next day ($25 proposed) Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
BasedHardware/omi#15320 ·
-
[adam] AdamNet network read doesn't cap to MAX_ADAM_PACKET_LEN, overflows client receive buffers Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
FujiNetWIFI/fujinet-firmware#1649 · 2 comentarios ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
HarbourMasters/Shipwright#7229 ·
-
Error while building from source Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
riscv-software-src/riscv-isa-sim#2435 · 1 comentario ·