Tag: sse

测试两个__m128i变量之间的相等性

如果我想在两个__m128i变量之间进行逐__m128i测试,我是否需要使用SSE指令或者我可以使用== ? 如果没有,我应该使用哪条SSE指令?

gcc是否使用英特尔的SSE 4.2指令进行文本处理?

我在这里读到英特尔推出了加速字符串处理的SSE 4.2 instructions 。 从文章引用: SSE 4.2指令集首先在Intel的Core i7中实现,提供了字符串和文本处理指令(STTNI),它们利用SIMD操作处理字符数据。 尽管这些指令最初是为加速字符串,文本和XML处理而设计的,但这些指令的强大新function在这些域之外是有用的,值得重新审视众多应用程序的搜索和识别阶段,以利用STTNI来提高性能 gcc是否可以使用这些说明? 如果是这样,哪个版本? 如果没有,是否有任何开源库提供此function?

具有SSE4.1内在函数的双线性滤波器

我试图找出一个合理快速的双线性过滤函数,一次只为一个过滤的样本,现在作为习惯使用内在函数的练习 – 直到SSE41是好的。 到目前为止,我有以下内容: inline __m128i DivideBy255_8xUint16(const __m128i value) { // Blinn 16bit divide by 255 trick but across 8 packed 16bit values const __m128i plus128 = _mm_add_epi16(value, _mm_set1_epi16(128)); const __m128i plus128ThenDivideBy256 = _mm_srli_epi16(plus128, 8); // TODO: Should this be an arithmetic or logical shift or does it matter? const __m128i partial = _mm_add_epi16(plus128, plus128ThenDivideBy256); […]

SSE(SIMD):通过标量乘以向量

我在程序中执行的常见操作是通过标量缩放矢量(V * s,例如[1,2,3,4] * 2 == [2,4,6,8])。 除了首先在向量中的每个位置加载标量(例如_mm_set_ps(2,2,2,2))然后相乘之外,是否有SSE(或AVX)指令来执行此操作? 这就是我现在所做的: __m128 _scalar = _mm_set_ps(s,s,s,s); __m128 _result = _mm_mul_ps(_vector, _scalar); 我在寻找像…… __m128 _result = _mm_scale_ps(_vector, s);

检查运行时是否支持SSE

我想检查运行时是否支持SSE4或AVX,以便我的程序可以利用特定于处理器的指令而无需为每个处理器创建二进制文件。 如果我可以在运行时确定它,我可以使用一个接口并在不同的指令集之间切换。

GCC – 如何重新排列堆栈?

我尝试构建一个使用pthreads和__m128 SSE类型的应用程序。 根据GCC手册,默认堆栈对齐是16个字节。 为了使用__m128,要求是16字节对齐。 我的目标CPU支持SSE。 我使用的GCC编译器不支持运行时堆栈重组(例如-mstackrealign)。 我不能使用任何其他GCC编译器版本。 我的测试应用程序如下: #include #include void *f(void *x){ __m128 y; … } int main(void){ pthread_t p; pthread_create(&p, NULL, f, NULL); } 应用程序生成exception并退出。 经过简单的调试(printf“%p”,&y)后,我发现变量y不是16字节对齐的。 我的问题是:如何在不使用任何GCC标志和属性(它们没有帮助)的情况下正确地重新对齐堆栈(16字节)? 我应该在这个线程函数f()中使用GCC内联汇编程序吗?

为什么_mm_stream_ps会产生L1 / LL缓存未命中?

我正在尝试优化计算密集型算法,并且遇到了一些缓存问题。 我有一个巨大的缓冲区,偶尔写入并随机写入,并在应用程序结束时只读取一次。 显然,写入缓冲区会产生大量的缓存未命中,并且还会污染之后需要再次进行计算的缓存。 我尝试使用非时间移动instrinsics,但缓存未命中(由valgrind报告并由运行时测量支持)仍然会发生。 但是,为了进一步研究非时间动作,我写了一个小测试程序,你可以在下面看到。 顺序访问,大缓冲区,只写。 #include #include #include #include void tim(const char *name, void (*func)()) { struct timespec t1, t2; clock_gettime(CLOCK_REALTIME, &t1); func(); clock_gettime(CLOCK_REALTIME, &t2); printf(“%s : %f s.\n”, name, (t2.tv_sec – t1.tv_sec) + (float) (t2.tv_nsec – t1.tv_nsec) / 1000000000); } const int CACHE_LINE = 64; const int FACTOR = 1024; float *arr; int […]

SSE指令在哪里优于正常指令

x86-64的SSE指令(向量指令)在哪里优于正常指令。 因为我所看到的是,执行SSE指令所需的频繁加载和存储会使由于向量计算而获得的任何增益无效。 那么有人可以给我一个示例SSE代码,它比普通代码表现更好。 它可能是因为我分别传递每个参数,像这样… __m128i a = _mm_set_epi32(pa[0], pa[1], pa[2], pa[3]); __m128i b = _mm_set_epi32(pb[0], pb[1], pb[2], pb[3]); __m128i res = _mm_add_epi32(a, b); for( i = 0; i < 4; i++ ) po[i] = res.m128i_i32[i]; 有没有办法我可以一次性传递所有4个整数,我的意思是一次性传递整个128字节的pa ? 并res.m128i_i32将res.m128i_i32分配给po ?

如何将未签名的int加载到SIMD中

我有一个C程序,我有一些无符号整数数组。 我正在使用这个声明uint32_t 。 我想使用SIMD对存储在每个arrays中的数据执行一些操作。 这是我被卡住的地方,因为看起来大多数SSE和SSE2函数只支持float和double。 加载uint32_t类型数据的最佳方法是什么?

数学’pow’函数gcc的SSE向量化

我试图对包含在数学库中使用’pow’函数的循环进行矢量化。 我知道英特尔编译器支持使用’pow’作为sse指令 – 但我似乎无法使用gcc运行(我认为)。 这是我正在使用的情况: int main(){ int i=0; float a[256], b[256]; float x= 2.3; for (i =0 ; i<256; i++){ a[i]=1.5; } for (i=0; i<256; i++){ b[i]=pow(a[i],x); } for (i=0; i<256; i++){ b[i]=a[i]*a[i]; } return 0; } 我正在编译以下内容: gcc -O3 -Wall -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5 code.c -o runthis 这是在使用gcc版本4.2的os X 10.5.8上(我也使用了4.5,并且无法判断它是否已经向量化了 – 因为它根本没有输出任何内容)。 似乎没有一个循环矢量化 – […]