Tag: simd

如何在ARM Cortex-a8中使用乘法和累加内在函数?

如何使用GCC提供的Multiply-Accumulate内在函数? float32x4_t vmlaq_f32 (float32x4_t , float32x4_t , float32x4_t); 任何人都可以解释我必须传递给这个函数的三个参数。 我的意思是源和目标寄存器以及函数返回的内容? 救命!!!

击败或满足OS X memset(和memset_pattern4)

我的问题是基于另一个SO问题: 为什么_mm_stream_ps会产生L1 / LL缓存未命中? 在读完它并被它吸引之后,我试图复制结果,看看自己哪个更快:天真循环,展开的幼稚循环, _mm_stream_ps (展开), _mm_stream_ps (展开)和最后但并非最memset_pattern4 。 (最后一个采用4字节模式,例如浮点数,并在目标数组上填充它,这应该与所有其他函数相同,但它可能是OS X独有的)。 我已确保将数组的开头对齐在高速缓存行(64字节,我检查过),并在参数中传递数组以及上一个问题中提到的任何其他性能调整。 有人想在gamedev上知道同样的事情: http ://www.gamedev.net/topic/532112-fast-memset/ 该线程的结论反映了我自己: 当目标arrays小于最大(L3)缓存时, _mm_store_ps比_mm_stream_ps快。 当目标数组较大时, _mm_stream_ps更快 。 我不完全确定为什么__mm_store_ps在第一种情况下更快,因为我从不在缓存中使用这些值,但我明白为什么_mm_stream_ps在后一种情况下胜出。 它适用于这种情况:将字节写入内存,您不需要立即(或永远)。 以下是目标数组比L3缓存大256倍(在我的情况下,1.5GB),使用gcc 4.8编译的结果: gcc-4.8 stream.c -o stream -std=c11 -O3 -g3 -ftree-vectorize -march=native -minline-all-stringops && ./stream bench L3-MASS, array 1610612736 bytes (402653184 floats, 0 remainder, 0x104803040 pointer) warm up round… 6% ( 20.81148 […]

为什么strchr的速度是我的simd代码的两倍

我正在学习SIMD,很想知道是否有可能在找到一个角色时击败strchr。 似乎strchr使用相同的内在函数,但我认为它检查null,而我知道该字符在数组中并计划避免空检查。 我的代码是: size_t N = 1e9; bool found = false; //Not really used … size_t char_index1 = 0; size_t char_index2 = 0; char * str = malloc(N); memset(str,’a’,N); __m256i char_match; __m256i str_simd; __m256i result; __m256i* pSrc1; int simd_mask; str[(size_t)5e8] = ‘b’; char_match = _mm256_set1_epi8(‘b’); result = _mm256_set1_epi32(0); simd_mask = 0; pSrc1 = (__m256i *)str; […]

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

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

将__m256i存储为整数

如何将__m256i数据类型存储为整数? 我知道浮子有: _mm256_store_ps(float *a, __m256 b) 其中第一个参数是输出数组。 对于整数我只发现: _mm256_store_si256(__m256i *a, __m256i b) 其中两个参数都是__m256i数据类型。 做这样的事情就足够了: int * X = (int*) _mm_malloc( N * sizeof (*X) ,32 ); (我使用它作为函数的参数,我想获得它的值) 内部function: __m256i * Xmmtype = (__m256i*) X; //fill output _mm256_store_si256( &Xmmtype[ i ] , T ); //T is __m256i 这个可以吗? – – -更新 – – – – – […]

如何将__attribute __((aligned(32)))应用于int *?

在我的程序中,我需要将__attribute__(( aligned(32)))应用于int *或float *我试过这样但我不确定它是否会起作用。 int *rarray __attribute__(( aligned(32))); 我看到了这个,但没有找到答案

如何使用SIMD加速XOR两块内存?

我想尽可能快地对两块内存进行异或,我如何使用SIMD来加速它? 我的原始代码如下: void region_xor_w64( unsigned char *r1, /* Region 1 */ unsigned char *r2, /* Region 2 */ int nbytes) /* Number of bytes in region */ { uint64_t *l1; uint64_t *l2; uint64_t *ltop; unsigned char *ctop; ctop = r1 + nbytes; ltop = (uint64_t *) ctop; l1 = (uint64_t *) r1; l2 = (uint64_t […]

如何使用SSE执行uint32 / float转换?

在SSE中有一个函数_mm_cvtepi32_ps(__m128i input) ,它接受32位宽的有符号整数( int32_t )的输入向量,并将它们转换为float s。 现在,我想将输入整数解释为未签名。 但是没有函数_mm_cvtepu32_ps ,我找不到一个实现。 你知道我在哪里可以找到这样的function,或者至少对实现有所暗示吗? 为了说明结果的差异: unsigned int a = 2480160505; // 10010011 11010100 00111110 11111001 float a1 = a; // 01001111 00010011 11010100 00111111; float a2 = (signed int)a; // 11001110 11011000 01010111 10000010

__m128i变量是零吗?

如何测试__m128i变量在SSE-2和更早版本的处理器上是否具有任何非零值?

在包装的SSE浮标上翻转标志

我正在寻找在SSE寄存器中打包的所有四个浮点数上翻转符号的最有效方法。 我没有在英特尔架构软件开发手册中找到这样做的固有内容。 以下是我已经尝试过的事情。 对于每个案例,我在代码上循环了100亿次并且显示了挂号时间。 我试图至少匹配4秒,这需要我的非SIMD方法,这只是使用一元减号运算符。 [48秒] _mm_sub_ps( _mm_setzero_ps(), vec ); [32秒] _mm_mul_ps( _mm_set1_ps( -1.0f ), vec ); [9秒] union NegativeMask { int intRep; 漂浮fltRep; } negMask; negMask.intRep = 0x80000000; _mm_xor_ps(_mm_set1_ps(negMask.fltRep),vec); 编译器是带有-O3的gcc 4.2。 CPU是英特尔酷睿2双核处理器。