eigen3 - Eigen3 矩阵差异很小但开销很大
问题描述
我想使用 eigen3 库在两个 640x512 小矩阵之间产生差异,我最终得到了一些高计算延迟(英特尔至强 16 核 @ 2.4GHz 上为 45 毫秒)。我可以问你一些提示来改善这种异常计算时间吗?下面是相关的代码片段:
static inline void tsnorm(stTime *ts)
{
while (ts->tv_nsec >= NSEC_PER_SEC)
{
ts->tv_nsec -= NSEC_PER_SEC;
ts->tv_sec++;
}
}
const unsigned short usRawFrameRows = 640;
const unsigned short usRawFrameCols = 512;
using pixType = unsigned short;
using pixDynMat = Matrix<pixType, Dynamic, Dynamic, RowMajor>;
pixDynMat biasFrame = pixDynMat::Zero(usRawFrameRows, usRawFrameCols);
pixType *myRawFrame = new pixType[usRawFrameRows * usRawFrameCols];
struct timespec tBeforeProcessFrameCall, tAfterProcessFrameCall;
clock_gettime(CLOCK_MONOTONIC_RAW, &tBeforeProcessFrameCall);
tsnorm(&tBeforeProcessFrameCall);
// Substract the bias from the current raw frame
MatrixXd calFrame = Map<pixDynMat>(myRawFrame, usRawFrameRows, usRawFrameCols).cast<double>()
- biasFrame.cast<double>();
clock_gettime(CLOCK_MONOTONIC_RAW, &tAfterProcessFrameCall);
tsnorm(&tAfterProcessFrameCall);
cout << " PHI processFrame overhead (ms) = " << (tAfterProcessFrameCall.tv_nsec - tBeforeProcessFrameCall.tv_nsec)/1e6 << endl;
干杯!
西尔万
解决方案
我已经编译了你的代码(i7-9700K):
Compiler: g++ -O3 -march=native test.cpp -o testbin
====================================================
PHI processFrame overhead (ms) = 0.952253
但是,如果没有优化:
Compiler: g++ test.cpp -o testbin
====================================================
PHI processFrame overhead (ms) = 20.1365
我怀疑您缺少编译器优化。您可以尝试在启用优化的情况下进行编译。根据常见问题解答页面,这可以轻松获得十倍或更多(请参阅http://eigen.tuxfamily.org/index.php?title=FAQ#Optimization)。
推荐阅读
- json - AWS DynamoDB 加密
- node.js - NodeJS从网络流图像,转换为WebP
- node.js - bcrypt 哈希与用户登录比较
- xml - 我怎样才能让 SVN 自动接受他们的某些文件/文件类型?
- php - 如何在 PHP 中使用 MongoDb 显示列的总和?
- reactjs - 上传文件类型错误时出现错误:网络请求失败,每当我尝试将图片上传到 s3 存储桶时
- c++ - 更新链表中的节点
- javascript - 如何在 ngx-treeview 中更改占位符
- python - 将 Cloud Text to Speech 音频文件保存到云存储
- amazon-web-services - 从 AWS Lambda 发送自定义状态代码