我寫了一些Naiive GEMM代碼,我想知道爲什麼它比等效的單線程GEMM代碼慢得多。多線程GEMM比單線程慢嗎?
使用200x200矩陣,單線程:7ms,多線程:108ms,CPU:3930k,線程池中有12個線程。
template <unsigned M, unsigned N, unsigned P, typename T>
static Matrix<M, P, T> multiply(const Matrix<M, N, T> &lhs, const Matrix<N, P, T> &rhs, ThreadPool & pool)
{
Matrix<M, P, T> result = {0};
Task<void> task(pool);
for (auto i=0u; i<M; ++i)
for (auto j=0u; j<P; j++)
task.async([&result, &lhs, &rhs, i, j](){
T sum = 0;
for (auto k=0u; k < N; ++k)
sum += lhs[i * N + k] * rhs[k * P + j];
result[i * M + j] = sum;
});
task.wait();
return std::move(result);
}
我希望你總共測量了minimim 5+秒以上的長時間重複運行,平均運行時間是7ms和128ms?否則你的時間可能會不準確,不是很有意義。 – IvoTops 2013-02-11 12:37:14