Question

Je convertir une partie de mon propre code d'algèbre de vecteur pour utiliser le boost optimisé bibliothèque uBLAS. Cependant, quand j'ai essayé de faire une multiplication SymmetricMatrix-sparsevector Je l'ai trouvé à environ 4x plus lent que ma propre mise en œuvre. La taille du vecteur est généralement autour 0-500 et environ 70-80% entrées sont nuls.

Voici mon code

void CRoutines::GetA(double a[], double vectorIn[], int sparseVectorIndexes[], int vectorLength, int sparseLength)
{
    compressed_vector<double> inVec (vectorLength, sparseLength);
    for(int i = 0; i < sparseLength; i++)
    {
        inVec(sparseVectorIndexes[i]) = vectorIn[sparseVectorIndexes[i]];
    }
    vector<double> test = prod(inVec, matrix);
        for(int i = 0; i < vectorLength; i++)
    {
        a[i] = test(i);
    }
}

sparseVectorIndexes stocke les indices des valeurs non nulles du vecteur d'entrée, vectorLength est la longueur du vecteur, et sparseLength est le nombre de non-zéros dans le vecteur. La matrice est stockée sous la forme d'une matrice symétrique symmetric_matrix<double, lower>.

Mon propre implémentation est simple itération de boucle imbriquée où la matrice est juste un double tableau 2D:

void CRoutines::GetA(double a[], double vectorIn[], int sparseVectorIndexes[], int vectorLength, int sparseLength)
 {
    for (int i = 0; i < vectorLength; i++)
    {
            double temp = 0;

            for (int j = 0; j < sparseLength; j++)
            {
                int row = sparseVectorIndexes[j];
                if (row <= i) // Handle lower triangular sparseness
                    temp += matrix[i][row] * vectorIn[row];
                else
                    temp += matrix[row][i] * vectorIn[row];
            }
            a[i] = temp;
    }

}

Pourquoi est-uBLAS 4x plus lent? Est-ce que je n'écris la multiplication correctement? Ou est-il une autre bibliothèque plus adaptée à cela?

EDIT: Si j'utilise un réseau dense de vecteur plutôt, uBLAS est seulement 2x plus lent ...

Était-ce utile?

La solution

uBLAS n'a pas été conçu comme objectif la performance n ° 1 à l'esprit. Il existe des bibliothèques qui sont nettement plus rapide que uBLAS. Voir par exemple http://eigen.tuxfamily.org/index.php?title=Benchmark

Autres conseils

PDF a toute une comparaison détaillée des différentes bibliothèques d'algèbre linéaire. Je suis tombé sur ce cette réponse informatique scientifique Stack Exchange, qui est peut-être un meilleur endroit pour ce genre de question.

Je ne sais pas si elle est la cause du ralentissement (avez-vous profil pour obtenir votre numéro 4x?), Mais cette boucle pourrait être lente:

for(int i = 0; i < vectorLength; i++)
    {
        a[i] = test(i);
    }

Si la plupart du temps est consacré au traitement des boucles dans votre code, puis cette boucle supplémentaire pourrait doubler le temps (et n'a rien à voir avec uBLAS). Je recommanderais d'utiliser à la place std::copy:

std::copy(test.begin(), test.end(), a[0])

La plupart des compilateurs doivent voir que cette copie est un double et faire une copie optimale, ce qui pourrait corriger un peu votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top