https://eigen.tuxfamily.org/dox/group__TopicStlContainers.html
这个上面已经说的很清楚了,如果使用现代c++特性,对齐问题无需考虑
https://cloud.tencent.com/developer/article/1631792
最后那道题目,如果是两个char, 那么占用的字节数是2.
如果是一个char,一个int,占用的字节数是 8.
In [c++17], this macro is empty.
http://eigen.tuxfamily.org/dox/group__TopicStructHavingEigenMembers.html
http://library.isr.ist.utl.pt/docs/roswiki/eigen(2f)Troubleshooting.html
https://zhuanlan.zhihu.com/p/93824687
验证0x7ffeef431ef0 除以 0x20的确不能被整除,之前有一个误解,以为内存对齐是看变量地址的差值,实际上就直接看每个变量的首地址即可。不用求差,方便很多。
使用了__attribute__ ((aligned (32))) double input1[4] = {1, 1, 1, 1}之后,0x7ffc5ca2e640/0x20=0x3FFE2E51732其地址可以被32整除了
Eigen::aligned_allocator的使用,分别使用c++98和c++17进行测试
C++ version | Code | Address | 16字节对齐 |
---|---|---|---|
C++ 98 | std::vector<Eigen::Vector4f > c | 0x7ffd071f4e28 | No |
C++ 98 | std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f > > c | 0x7ffd397b3cb0 | Yes |
C++ 17 | std::vector<Eigen::Vector4f > c | 0x7ffd46101478 | No |
C++ 17 | std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f > > c | 0x7ffd46101480 | Yes |
(判断是否16字节对齐,只要用地址除以0x10即可) 使用字节对齐,只有两个坏处,每一处使用需要使用标记+会浪费一点内存空间。 并没有出现eigen官网中出现的自动对齐的情况,说明我的Eigen库并没有那么新。所以保险起见,应该还是要加上的。
查看eigen是否使用了向量化
https://eigen.tuxfamily.org/index.php?title=FAQ#Vectorization
对于这一段代码:
EIGEN_ASM_COMMENT("begin");
u = v + w;
EIGEN_ASM_COMMENT("end");
对应的汇编代码:
movaps (%rdx), %xmm0
addps (%rsi), %xmm0
movaps %xmm0, (%rdi)
当使用vector3f的时候,不管对不对齐,其对应的汇编代码均为:
movq 32(%rsp), %rax
movss (%rax), %xmm0
addss 12(%rax), %xmm0
movss %xmm0, 60(%rsp)
movss 4(%rax), %xmm0
addss 16(%rax), %xmm0
movss %xmm0, 64(%rsp)
movss 8(%rax), %xmm0
addss 20(%rax), %xmm0
movss %xmm0, 68(%rsp)
也就是说,Vector3f也是使用了SSE加速的。只不过更复杂,验证一下,假设用同样的次数,Vector4f的是不是要比Vector3f要快。验证结论:
uint64_t test_time = 1e17
vec3f cost time 554.156 ms
vec4f cost time 345.562 ms
实际上,加了Eigen::aligned_allocatorEigen::Vector3f 并没有什么用