你有一个三(或四)个浮点数的向量.总结它们的最快方法是什么?
SSE(movaps,shuffle,add,movd)总是比x87快吗?SSE4.2中的水平加法说明值得吗?移动到FPU的成本是多少,然后是faddp,faddp?什么是最快的特定指令序列?
"尝试安排事情,这样你可以一次总结四个向量"将不被接受作为答案.:-)
我有一些代码,最初是由MSVC工作人员给我的,我正试图让它在Clang上工作.这是我遇到麻烦的功能:
float vectorGetByIndex( __m128 V, unsigned int i )
{
assert( i <= 3 );
return V.m128_f32[i];
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误如下:
Member reference has base type '__m128' is not a structure or union.
Run Code Online (Sandbox Code Playgroud)
我环顾四周,发现Clang(也许是GCC)在将__m128视为结构或联合时遇到了问题.但是我还没有找到一个直接的答案,我怎么能得到这些价值.我已经尝试过使用下标运算符而无法做到这一点,我已经浏览了大量的SSE内在函数列表并且尚未找到合适的函数.
我正在尝试学习使用内在函数进行编码,下面是一个添加代码的代码
compiler used: icc
#include<stdio.h>
#include<emmintrin.h>
int main()
{
__m128i a = _mm_set_epi32(1,2,3,4);
__m128i b = _mm_set_epi32(1,2,3,4);
__m128i c;
c = _mm_add_epi32(a,b);
printf("%d\n",c[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下错误:
test.c(9): error: expression must have pointer-to-object type
printf("%d\n",c[2]);
Run Code Online (Sandbox Code Playgroud)
如何在c类型变量中打印值__m128i
我正在尝试使用sse加速我的代码,以下代码运行良好.基本上__m128变量应该指向一行中的4个浮点数,以便一次执行4个操作.
此代码等同于计算c[i]=a[i]+b[i]与i从0向3.
float *data1,*data2,*data3
// ... code ... allocating data1-2-3 which are very long.
__m128* a = (__m128*) (data1);
__m128* b = (__m128*) (data2);
__m128* c = (__m128*) (data3);
*c = _mm_add_ps(*a, *b);
Run Code Online (Sandbox Code Playgroud)
但是,当我想要移动我使用的数据(见下文)时,为了c[i]=a[i+1]+b[i]使用ifrom 0来计算3,它会在执行时崩溃.
__m128* a = (__m128*) (data1+1); // <-- +1
__m128* b = (__m128*) (data2);
__m128* c = (__m128*) (data3);
*c = _mm_add_ps(*a, *b);
Run Code Online (Sandbox Code Playgroud)
我的猜测是,它与__m128为128位且浮点数据为32位这一事实有关.因此,128位指针可能无法指向不能被128整除的地址.
无论如何,你知道问题是什么以及如何绕过它吗?
sse ×4
assembly ×2
c ×2
c++ ×2
intrinsics ×2
simd ×2
clang ×1
optimization ×1
pointers ×1
x86 ×1