wolny wektor macierzy wektorowej (CSR) przy użyciu otwartego MP

Próbuję przyspieszyć rzadki produkt wektor macierzowy przy użyciu otwartego MP, kod jest następujący:

void zAx(double * z, double * data, long * colind, long * row_ptr, double * x, int M){

long i, j, ckey;
int chunk = 1000;
//int * counts[8]={0};
#pragma omp parallel num_threads(8)
{ 
  #pragma omp for private(ckey,j,i) schedule(static,chunk)
  for (i=0; i<M; i++ ){ 
    z[i]=0;
    for (ckey=row_ptr[i]; ckey<row_ptr[i+1]; ckey++) {
      j = colind[ckey];
      z[i] += data[ckey]*x[j];
    }              
  }
}
}

Teraz ten kod działa dobrze i daje poprawny wynik, ale daje mi tylko przyspieszenie ~ 30%. Sprawdziłem, czy wszystkie wątki mają taką samą liczbę niezerowych elementów (są), a macierz jest dość duża (300 000 x 300 000), więc mam nadzieję, że obciążenie nie jest jedynym problemem . Próbowałem również uruchomić z różnymi rozmiarami porcji i numerami wątków, i uzyskuję podobną wydajność.

Czy jest coś jeszcze, co mógłbym próbować uzyskać z tej dodatkowej prędkości? Albo coś, co oczywiście robię źle?

Twoje zdrowie.

Edycja: właśnie skomentowano '// int * liczy [8] = {0}', ponieważ pozostałość po zliczeniu przydziału pracy. Nie są potrzebne

Edit2 (więcej szczegółów):

OK, więc zmierzyłem czas pętli 5000 razy i otrzymałem średni czas:

seq: 0.0036 (sekundy?)2 wątki: 0,0026134 wątki: 0,0023088 wątków: 0,002384

Macierz ma rozmiar:303544x303544 i ma:2122980 elementy niezerowe.

Przy znacznie mniejszej matrycy 30000x30000 uzyskuję czasy, które idą bardziej jak

seq 0.0003038 wątków 0,000078

Wydaje się, że duży rozmiar może być moim problemem.

questionAnswers(2)

yourAnswerToTheQuestion