Eigen库对齐问题:declspec(align('16')) 的形参将不被对齐
一:错误提示:error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned
英文提示:error C2719: 'p': formal parameter with __declspec(align('16')) won't be aligned
中文提示:error C2719: “p”: 具有 __declspec(align('16')) 的形参将不被对齐
导致整个现象的主要原因是使用了Eigen库,Eigen为了使用SSE加速,所以内存分配上使用了128位的指针。
更加准确的说法:
“First, "fixed-size" should be clear: an Eigen object has fixed size if its number of rows and its number of columns are fixed at compile-time. So for example Matrix3f has fixed size, but MatrixXf doesn't (the opposite of fixed-size is dynamic-size).
The array of coefficients of a fixed-size Eigen object is a plain "static array", it is not dynamically allocated. For example, the data behind a Matrix4f is just a "float array[16]".
Fixed-size objects are typically very small, which means that we want to handle them with zero runtime overhead -- both in terms of memory usage and of speed.
Now, vectorization (both SSE and AltiVec) works with 128-bit packets. Moreover, for performance reasons, these packets need to be have 128-bit alignment.
So it turns out that the only way that fixed-size Eigen objects can be vectorized, is if their size is a multiple of 128 bits, or 16 bytes. Eigen will then request 16-byte alignment for these objects, and henceforth rely on these objects being aligned so no runtime check for alignment is performed.”
二:解决方案:
分为四种情况:
- Cause 1: Structures having Eigen objects as members
- Cause 2: STL Containers
- Cause 3: Passing Eigen objects by value
- Cause 4: Compiler making a wrong assumption on stack alignment (for instance GCC on Windows)
每种情况可以对照官方的说法。可以参考如下链接
http://eigen.tuxfamily.org/dox/TopicUnalignedArrayAssert.html
在此不再重复表述。
三:我的解决方法:eigen 3.1.2有 bug, 重装Eigen;
关闭使用 预编译头;
关闭编译选项里面的16位对齐;
把Eigen::Vector4f 传值改为 传引用 Eigen::Vector4f &;
把结构体 传值 全部转换为 传引用。躲过对齐!!!
编译器选项:C/C++ ---代码生成---结构图成员对齐;
可恶:忘记了当初是怎么解决的!!!!!
四:对stl vector 进行修改:http://blog.csdn.net/pkueecser/article/details/8602656
产生问题的resize()方法,改为:
{ // determine new length, padding with _Val elements as needed
if (size() < _Newsize)
_Insert_n(end(), _Newsize - size(), _Val);
else if (_Newsize < size())
erase(begin() + _Newsize, end());
}
注意其中红色部分,将传值改为传参,避免在参数栈上创建被对齐的结构的对象。然后,在我们使用std::vector< Foo<5, float> >之前包含我们的foo_vector.hpp头文件,就可以正常使用了。 注意红色部分.....
是微软坑呢?还是Eigen坑?个人感觉微软更坑!!!
后记:
添加 修改为 869行为引用之后,引发2562行的错误,修改方式为 把第二个参数0去掉。
Eigen库对齐问题:declspec(align('16')) 的形参将不被对齐相关推荐
- 初探Eigen(error C2719: “Qcw”: 具有 __declspec(align('16')) 的形参将不被对齐)
想写一个方向余弦矩阵转四元数的小函数,试用Eigen,如下所示: bool DCM2Q(Eigen::Matrix3f DCM, Eigen::Vector4f Qcw) 结果编译却出现错误:erro ...
- eigen库学习笔记
#简介 Eigen是有关线性代数(矩阵.向量等)的c++模板库.支持SSE2/3/4, ARM NEON (32-bit and 64-bit), PowerPC AltiVec/VSX (32-bi ...
- 0.前言 与 Eigen库的使用整理
[C++ 基于Eigen库实现CRN前向推理] 前言:背景 与 Eigen库的使用整理 前言:(Eigen库使用记录) 第一部分:WavFile.class (实现读取wav/pcm,实现STFT) ...
- 关于C++中Eigen库效率提升的思考
目录 引言 一.什么是Eigen? 二.使用步骤 1.引入库 2.建立矩阵 3.基本操作 三.具体的例子--矩阵乘法 1.Eigen库 2.GPU并行计算 总结 可能的方案 引言 在处理矩阵运算上,各 ...
- Eigen库学习教程(全)
说明:本教程主要是对eigen官网文档做了一个简要的翻译,参考了eigen官网以及一些博主的技术贴,在此表示感谢. Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相 ...
- R语言ggplot2可视化:为可视化图像添加多行标题(multi line title)并将多行标题居中对齐(center align)
R语言ggplot2可视化:为可视化图像添加多行标题(multi line title)并将多行标题居中对齐(center align) 目录
- 使用 Eigen 库写第一个程序
一.使用 Eigen 库时编译器设置 使用 Eigen 库之前需要下载库文件,并进行简单的设置. 下载地址: http://eigen.tuxfamily.org/index.php?title=Ma ...
- ROS中使用Eigen库[不定期更新]
前期说明 ROS中的数据操作需要线性代数,Eigen库是C++中的线性代数计算库. Eigen库独立于ROS,但是在ROS中可以使用. Eigen库可以参见http://eigen.tuxfamily ...
- nlp论文-《Neural Machine Translation by Jointly Learning to Align and Translate》-基于联合学习对齐和翻译的神经机器翻译(一)
<Neural Machine Translation by Jointly Learning to Align and Translate>--基于联合学习对齐和翻译的神经机器翻译 作者 ...
最新文章
- mysql rollback函数_PHP mysqli_rollback() 函数_程序员人生
- 2月07日云栖精选夜读:观点 | 阿里云 MVP 唐俊飞:安全性可以认为是一种能力...
- MySQL Transaction--快照读和当前读
- The import javax.servlet cannot be resolved
- 成员缩写_青春有你2snh48成员都有谁 10名SNH48女团成员介绍
- MATLAB在通信系统仿真中的注意
- html5 内嵌网页_如何分析并优化网页的性能?新梦想软件测试
- cmd中加载java源文件_如何在cmd中编译和运行java源文件
- 简述linux常见的安全措施,六个常用的Linux安全基本措施
- 【原创】基于phpGrace+uniApp开发之:5.登录界面增加图片验证码
- 记录一次游戏服务器的压测调优记录(Golang语言)
- 扩展频谱--直接序列扩频
- (超详细,避免踩坑)如何使用freeMaker模板生成器处理图片以及文字替换
- 【Dam Dadi Doo】MMD镜头+动作打包下载.zip
- P4315 月下“毛景树” 树链剖分+线段树
- python如何模拟键盘输入_Python模拟键盘输入和鼠标操作
- 踢球骨折在家day5
- Redis学习(二)之 Redis Cluster集群
- C语言之不等式的写法,大于小于等于
- 计算机工具栏图标素材,设计软件工具栏图标icon