我正在轉換一些我自己的矢量代數代碼,以使用優化的boost uBLAS庫。但是,當我嘗試執行SymmetricMatrix-SparseVector乘法時,發現它比我自己的實現慢大約4倍。矢量大小通常在0-500左右,大約70-80%的條目爲零。uBLAS慢矩陣 - SparseVector乘法
這是我的代碼
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存儲輸入矢量的非零值的索引,vectorLength是矢量的長度,和sparseLength是非零的載體中的數。該矩陣被存儲爲對稱矩陣symmetric_matrix<double, lower>
。
我自己的實現是一個簡單的嵌套循環迭代,其中矩陣只是一個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;
}
}
爲什麼是4倍的uBLAS庫慢?我不是在正確地寫乘法嗎?還是有另一個圖書館更適合這個?
編輯:如果我使用一個密集的矢量陣列,而不是那麼的uBLAS只有2倍慢...
如果這是在Visual Studio中,你是否檢查你是否在調試模式下編譯它? – Jacob 2011-06-13 13:34:21
絕對編譯爲Release,優化全部,並且不在IDE中測試。 – 2011-06-13 13:40:47
請張貼擴展代碼 - vectorIn'從哪裏來,它的類型是什麼?在第二個非uBlas代碼中創建了哪些對象副本?請張貼您正在測量的所有代碼,以獲得4倍速度減慢數字。 – 2011-06-13 13:47:57