c++ - 为什么我的 Eigen 代码不能随更多线程扩展

标签 c++ matrix sparse-matrix eigen

我有一个 Eigen/C++ 代码,其目的是执行行主要稀疏矩阵乘法和密集列主要稀疏矩阵乘法,both of which are multithreaded in Eigen .

但是,我发现只有row major sparse - dense multiplication在缩放,而dense-col major sparse multiplication没有。为什么是这样?下面是代码和时间。

/*timer function*/
double getHighResolutionTime(void) {
struct timeval tod;
gettimeofday(&tod, NULL);
double time_seconds = (double) tod.tv_sec + ((double) tod.tv_usec / 1000000.0);
return time_seconds;
}

...

//define Col Major Sparse
Map<SparseMatrix<double,ColMajor> > gcol (m, n, nz, jc_int, ir_int, pr);

//define the same matrix but Row Major
Map<SparseMatrix<double,RowMajor> > grow (m, n, nz, jc_int, ir_int, pr);

//define dense matrix
Map<MatrixXd> G (PR1, M, N );

//define result
Map<MatrixXd> result (PR2, M, N);

//row major sparse - dense product
double tic=getHighResolutionTime();
result=grow*G;
double toc=getHighResolutionTime();
printf("\nsparse-dense time: %f seconds", (toc - tic));

//dense - col major sparse product
tic=getHighResolutionTime();
result=G*gcol;
toc=getHighResolutionTime();
printf("\ndense-sparse time: %f seconds\n", (toc - tic));

使用 1、2、4、8 和 16 线程(在 16 核机器上)的输出和时序。只有稀疏-密集尺度,而不是密集-稀疏尺度。

Using 1 threads...
sparse-dense time: 5.184886 seconds
dense-sparse time: 3.278560 seconds

Using 2 threads...
sparse-dense time: 2.808550 seconds
dense-sparse time: 3.275191 seconds

Using 4 threads...
sparse-dense time: 1.589596 seconds
dense-sparse time: 3.278983 seconds

Using 8 threads...
sparse-dense time: 1.005600 seconds
dense-sparse time: 3.279466 seconds

Using 16 threads...
sparse-dense time: 0.736803 seconds
dense-sparse time: 3.278893 seconds

附加信息:矩阵为 7000x7000 随机、实数和 double 。稀疏矩阵是随机的,密度为 1%。两次乘法的数值结果都是正确的。我正在使用以下标志进行编译:

-fomit-frame-pointer -O3 -DNDEBUG -fopenmp -march=native -fPIC

编辑:

ggael 的回答效果很好。以下是新的缩放比例:

Using 1 threads...
sparse-dense time: 5.070809 seconds
dense-sparse time: 3.270347 seconds

Using 2 threads...
sparse-dense time: 2.786790 seconds
dense-sparse time: 2.070378 seconds

Using 4 threads...
sparse-dense time: 1.580925 seconds
dense-sparse time: 1.243466 seconds

Using 8 threads...
sparse-dense time: 1.000152 seconds
dense-sparse time: 0.887953 seconds

Using 16 threads...
sparse-dense time: 0.898228 seconds
dense-sparse time: 0.909603 seconds

最佳答案

您需要 Eigen 的头部(参见相应的 commit )。

关于c++ - 为什么我的 Eigen 代码不能随更多线程扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50012113/

相关文章:

C++ priority_queue 底层 vector 容器容量调整大小

r - 使用 R 中矩阵中不同行的值填充矩阵中的缺失值

c++ - 在 CRS 稀疏矩阵中查找值?

C++ 精确除法会失去精度吗?

c++ - 创建自定义迭代器时如何获取 std::pair 的第一个和第二个?

c++ - 如何为函数指针设置默认函数?

r - 如何有效地索引和乘以两个矩阵?

python - 在 NumPy 中转置存储在一维数组中的矩阵的最快方法?

python - 访问python中特定矩阵行中的非零元素

apache-spark - Spark Cosine Similarity(DIMSUM算法)稀疏输入文件