최적화 된 부스트 uBLAS 라이브러리를 사용하기 위해 자신의 벡터 대수 코드를 변환 중입니다. 그러나 SymmetricMatrix-SparseVector 곱셈을 할려고 할 때, 내 구현보다 약 4 배 느린 것으로 나타났습니다. 벡터 크기는 일반적으로 약 0-500이며 약 70-80 % 항목은 0입니다. 여기 uBLAS 저조한 매트릭스 - SparseVector 곱셈
내 코드sparseVectorIndexes 입력 벡터의 비 - 제로 값의 인덱스를 저장
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);
}
}
이다 vectorLength는 벡터의 길이이고, sparseLength는 벡터 내의 비 제로의 개수 . 행렬은 대칭 행렬
symmetric_matrix<double, lower>
으로 저장됩니다.
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;
}
}
가 왜 느린 uBLAS 4 배입니다 :
내 자신의 구현은 매트릭스 그냥 2D double 배열하는 간단한 중첩 된 루프 반복인가? 곱셈을 올바르게 쓰지 않습니까? 아니면 이것에 더 적합한 또 다른 도서관이 있습니까?
편집 : 조밀 한 벡터 배열을 사용하는 경우가 침체의 원인 인 경우 대신 다음 uBLAS이 ... 확실하지
Visual Studio에서 디버그 모드로 컴파일 중인지 확인 했습니까? – Jacob
Release로 컴파일하고, IDE에서 테스트를하지 않고 모두 최적화합니다. –
확장 코드를 게시하십시오 - 'vectorIn'은 어디에서 왔으며, 그 타입은 무엇입니까? 두 번째 비 uBlas 코드에서 생성되는 객체 복사본은 무엇입니까? 측정 코드가 4x 속도 저하 번호를 표시하도록 게시하십시오. –