У меня проблемы с тем, что я считаю ложным кешированием, я получаю лишь небольшое ускорение при использовании следующего кода по сравнению с несравненной версией.
matrix1 и matrix2 - это разреженные матрицы в структурев формате (row, col, val).
void pMultiply(struct SparseRow *matrix1, struct SparseRow *matrix2, int m1Rows, int m2Rows, struct SparseRow **result) {
*result = malloc(1 * sizeof(struct SparseRow));
int resultNonZeroEntries = 0;
#pragma omp parallel for atomic
for(int i = 0; i < m1Rows; i++)
{
int curM1Row = matrix1[i].row;
int curM1Col = matrix1[i].col;
float curM1Value = matrix1[i].val;
for(int j = 0; j < m2Rows; j++)
{
int curM2Row = matrix2[j].row;
int curM2Col = matrix2[j].col;
float curM2Value = matrix2[j].val;
if(curM1Col == curM2Row)
{
*result = realloc(*result,
(sizeof(struct SparseRow)*(resultNonZeroEntries+1)));
(*result)[resultNonZeroEntries].row = curM1Row;
(*result)[resultNonZeroEntries].col = curM2Col;
(*result)[resultNonZeroEntries].val += curM1Value*curM2Value;
resultNonZeroEntries++;
break;
}
}
}