OpenMathLib / OpenMathLib/OpenBLAS
[z|c]gemv assume no inf or nan in buffer on x86_64
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- C
- Sterne
- 7.6k
- Forks
- 1.7k
- Ø Merge
- 1 T. 3 Std.
- Gemergte PRs (30 T.)
- 42
Beschreibung
cgemv_t.S and zgemv_t.S return wrong results when the buffer contains NaN or Inf values. I guess that somewhere it assume that 0 * buffer[i] = 0 without initializing buffer[i]. The buffer may contains NaN or Inf values because of previous OpenBLAS functions calls.
Any easy workaround would be to memset the buffer in zgemv.c but IMHO it should be fixed in the assembler code (which I'm not able to do). Here is a simple program which reproduce the issue.
#include <math.h>
#include <assert.h>
#include <stdlib.h>
// OpenBLAS private API used to simulate a previous function call which add a NaN to the buffer
void * blas_memory_alloc(int);
void blas_memory_free(void*);
int main(void) {
int size = 59;
int size2 = 50;
float v = 1;
int one = 1;
float * buffer = (float *)blas_memory_alloc(1);
for(int i = 0; i < 256; i++)
// also work with buffer[i] = 1./0;
buffer[i] = sqrt(-1);
blas_memory_free(buffer);
float * A = calloc(size * size, 2 * 4);
float * y = calloc(size, 2 * 4);
float * x = calloc(size, 2 * 4);
for(int i = 0; i < 2*size*size; i++)
A[i] = i;
for(int i = 0; i < 2*size; i++) {
y[i] = i;
x[i] = i;
}
cgemv_("T", &size, &size2, &v, A, &size, x, &one, &v, y, &one);
for(int i = 0; i < 2 * size; i++)
assert(!isnan(y[i]));
}
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem Reproducer im Issue und untersuche cgemv_t.S und zgemv_t.S, wobei zgemv.c als erwähnter Ort für den Workaround dient. Verifiziere den Fehler, wenn der Buffer NaN- oder Inf-Werte enthält, und bestätige anschließend, dass derselbe cgemv_-Aufruf ohne ein caller-seitiges memset Ergebnisse liefert, die nicht NaN sind.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- c
- Bereich
- performance
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100