是什么区别_m256i,并_m256d和_m256?和
之间有什么区别_m128i和_m128d和_m128?
数据必须是16字节对齐的,以便SSE指令可以处理它而不会出现分段错误吗?我试过的编译器是带有选项的gcc -msse2.我想_mm_cmpgt_epi32用来比较一个大的int数组.我发现它不能在数组的任何位置执行,除了下标为4的倍数的位置.
我有一个代码片段。该代码段仅加载 2 个数组并使用 SSE 计算它们之间的点积。
代码在这里:
using namespace std;
long long size = 3200000;
float* _random()
{
unsigned int seed = 123;
// float *t = malloc(size*sizeof(float));
float *t = new float[size];
int i;
float num = 0.0;
for(i=0; i < size; i++) {
num = rand()/(RAND_MAX+1.0);
t[i] = num;
}
return t;
}
float _dotProductVectorSSE(float *s1, float *s2)
{
float prod;
int i;
__m128 X, Y, Z;
for(i=0; i<size; i+=4)
{
X = _mm_load_ps(&s1[i]);
Y = _mm_load_ps(&s2[i]);
X = …Run Code Online (Sandbox Code Playgroud) MOVMSKB将字节字段打包成位是一件非常好的工作.
但是我想反过来.
我有一个16位的字段,我想放入XMM寄存器.
每位1字节字段.
优选地,设置位应该设置每个字节字段的MSB(0x80),但是我可以使用设置位,从而在字节字段中产生0xFF结果.
我在https://software.intel.com/en-us/forums/intel-isa-extensions/topic/298374上看到了以下选项:
movd mm0, eax
punpcklbw mm0, mm0
pshufw mm0, mm0, 0x00
pand mm0, [mask8040201008040201h]
pcmpeb mm0, [mask8040201008040201h]
Run Code Online (Sandbox Code Playgroud)
但是,此代码仅适用于MMX寄存器,不能与XMM regs一起使用,因为pshufw不允许这样做.
我知道我可以使用PSHUFB,但是那是SSSE3而我想拥有SSE2代码,因为它需要在任何AMD64系统上运行.
有没有办法做到这一点是纯SSE2代码?
请不要内在,只需简单的intel x64代码.
我正在尝试为我的游戏做一些计算,我正在尝试计算两点之间的距离.基本上,我正在使用圆的方程来查看这些点是否在我定义的半径范围内.
(x - x1)^2 + (y - y1)^2 <= r^2
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何用SSE评估条件语句并解释结果?到目前为止我有这个:
float distSqr4 = (pow(x4 - k->getPosition().x, 2) + pow(y4 - k->getPosition().y, 2));
float distSqr3 = (pow(x3 - k->getPosition().x, 2) + pow(y3 - k->getPosition().y, 2));
float distSqr2 = (pow(x2 - k->getPosition().x, 2) + pow(y2 - k->getPosition().y, 2));
float distSqr1 = (pow(x1 - k->getPosition().x, 2) + pow(y1 - k->getPosition().y, 2));
__m128 distances = _mm_set_ps(distSqr1, distSqr2, distSqr3, distSqr4);
__m128 maxDistSqr = _mm_set1_ps(k->getMaxDistance() * k->getMaxDistance());
__m128 result = _mm_cmple_ps(distances, maxDistSqr);
Run Code Online (Sandbox Code Playgroud)
一旦我得到结果变量,我就迷路了.我如何使用刚刚得到的结果变量?我的计划是,如果评估的条件证明是真的,做一些光照计算,然后在屏幕上绘制像素.在这种情况下,我如何解释真实与虚假?
任何有关正确方向的帮助都非常感谢!
我有一个__m128i充满32位整数的寄存器。我想从寄存器中提取第4个元素。
例如,如果
int extract;
__m128i register = _mm_set_epi32(3,2,1,0);
Run Code Online (Sandbox Code Playgroud)
然后我想“提取”值为3。
似乎_mm_extract_epi32()应该可以完成工作。但是,它有一个imm8参数。
图: 在英特尔网站上的描述
我只是不了解imm8工作方式(或者在这种情况下会工作)。有人可以详细说明如何使用imm8作为参数吗?
是否有一个寄存器包含向量/数组中的元素数量,我必须在使用mulssor 之类的操作之前加载它addss,或者我是否必须将该数字压入堆栈?SSE 指令如何在不超过末尾的情况下知道向量的长度?
我正在编写一些SSE/AVX代码,并且有一项任务是将打包的带符号32位整数除以2的补码.当值为正时,此移位工作正常,但由于移位符号位,因此会产生错误的负值结果.
是否有任何SIMD操作可以让我移位保留符号位的位置?谢谢
我正在使用Fasm(程序集),我正在寻找这些内在指令的SSE2汇编指令:
_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8
Run Code Online (Sandbox Code Playgroud)
我从哪里得到它们(网站,pdf ......)?
我有以下循环:
float* s;
float* ap;
float* bp;
... // initialize s, ap, bp
for(size_t i=0;i<64;++i) {
s[i] = ap[i]+bp[i];
}
Run Code Online (Sandbox Code Playgroud)
似乎是矢量化的良好候选者。尽管我打开了优化功能,但是当我查看程序集输出时,clang(我正在使用Xcode)似乎没有向量化循环:
LBB33_1: ## =>This Inner Loop Header: Depth=1
movss (%rax,%rsi,4), %xmm0 ## xmm0 = mem[0],zero,zero,zero
addss (%rcx,%rsi,4), %xmm0
movss %xmm0, (%rdx,%rsi,4)
Ltmp353:
incq %rsi
Ltmp354:
cmpq $64, %rsi
Ltmp355:
jne LBB33_1
Run Code Online (Sandbox Code Playgroud)
如何获得clang / Xcode来向量化此简单循环?