奇怪的SIMD指令行为
Strange SIMD instruction behavior
SSE2指令(paddd xmm, m128)工作起来真的很奇怪。代码说明一切。
#include <iostream>
using namespace std;
int main()
{
int * v0 = new int [80];
for (int i=0; i<80; ++i)
v0[i] = i;
int * v1 = new int [80];
for (int i=0; i<80; ++i)
v1[i] = i;
asm(
".intel_syntax noprefix;"
"mov rcx , 20;"
"mov rax , %0;"
"mov rbx , %1;"
"m_start:;"
"cmp rcx , 0;"
"je m_end;"
"movdqu xmm0 , [rax];"
"paddd xmm0 , [rbx];"
"movdqu [rax] , xmm0;"
"add rbx , 16;" /* WTF?? If I put there 128, it's work really bad */
"add rax , 16;" /* but why?? I must add 128 because XMM width is 128 bits ... */
"dec rcx;"
"jmp m_start;"
"m_end:;"
".att_syntax noprefix;"
: //
: "r"(v0) , "r"(v1)
: //
);
for (int i=1; i<81; ++i)
{
cout << v0[i-1] << (char*)((i%10==0) ? "n" : ", ");
}
return 0;
}
必须加上16,因为128位是16个字节。
附加说明:你忘了告诉编译器你修改了一些寄存器,你也不应该在没有告诉编译器的情况下切换语法(使用-masm=intel
switch代替)。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 函数名是c中该函数的第一条指令的地址吗
- 错误:无效的预处理指令 #i 的意思是 #if?
- 组装指令中乘法的下部和上部是什么
- 在 C++ 中使用 SIMD 向量的矩阵乘法
- OpenMP 与有序和关键指令并行
- C++中的移动分配出现问题.非法指令: 4.
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 关于连续迭代器的 SIMD 指令
- 为什么这个简单的 C++ SIMD 基准测试在使用 SIMD 指令时运行速度较慢?
- 在Visual Studio 2015中检测与C 宏一起使用的SIMD指令集
- 通过内部函数或指令手动控制英特尔 MIC SIMD 操作
- SIMD 指令中不接受索引
- SIMD指令缺少OpenMP if子句
- OpenMP奇怪的行为与SIMD线性和并行的线性指令
- 调度SIMD指令+ SIMDPP + qmake
- 是否有SIMD指令来加速校验和计算
- 奇怪的SIMD指令行为