标签: simd

如何检查我的Linux Box安装安装是否具有SSE指令功能?

如何检查我的Linux Box安装安装是否具有SSE指令功能?

我正在尝试安装libjpeg-turbo,我想确保它充分利用我的盒子的功能.

c++ linux sse simd libjpeg

1
推荐指数
1
解决办法
723
查看次数

arm_neon.h是否缺少所有float16_t类型?

我正在使用NEON SIMD指令编写Android应用程序的一部分,目标是Cortex A8处理器.根据这篇参考手册,NEON支持16位和32位浮点数,即float16_tfloat32_t.当我尝试使用float16_t它及其所有相关的矢量类型时,我得到一个错误,说这种类型是未声明的.在查看内容时arm_neon.h,我发现这种类型确实是未声明的.

是否有一个原因?ARM的高级SIMD显然支持这些数据类型和指令.有没有人遇到/解决了这个?是否记录在任何地方?

android arm simd neon

1
推荐指数
1
解决办法
3247
查看次数

simd存储延迟

我有以下类型的代码

short v[8] __attribute__ (( aligned(16)));
...
// in an inlined function :
_mm_store_si128(v, some_m128i_value);
... // some more operation (4 additions )
outp[0] = v[1] / 2; // <- first access of v since the previous store 
Run Code Online (Sandbox Code Playgroud)

当我用perf注释这个代码时,这一行占整个采样的18%!当我说行时,它处于汇编级别,即从v计数移动18%后的指令

它是缓存未命中吗?我怎么测试呢?

我真的不需要存储结果,但是如何避免往返内存,并且仍然单独访问组成我的m128i值的8短路.

更新:如果我使用_mm_extract_epi16,那么整体性能并不是更好,但等待在每次访问之间平均分配,而不是仅仅按第一次访问.

c gcc sse simd

1
推荐指数
1
解决办法
181
查看次数

SSE指令需要对齐数据

数据必须是16字节对齐的,以便SSE指令可以处理它而不会出现分段错误吗?我试过的编译器是带有选项的gcc -msse2.我想_mm_cmpgt_epi32用来比较一个大的int数组.我发现它不能在数组的任何位置执行,除了下标为4的倍数的位置.

x86 sse simd

1
推荐指数
1
解决办法
929
查看次数

C#类和实例构造函数

MSDN RyuJIT博客中给出了这样的指令设置CTP3:

在RyuJIT最终之前需要一些棘手的事情:将一个对Microsoft.Numerics.Vectors.Vector的引用添加到将在使用新Vector类型的方法之前调用的类构造函数.我建议把它放在程序的入门类的构造函数中.它必须出现在类构造函数中,而不是实例构造函数中.

我对Objective-C中的类/实例构造比我在C#中更精通.他在谈论一个不同的概念吗?C#中的类构造函数和实例构造函数有什么区别?在这种情况下,"类构造函数"只是无参数构造函数吗?

c# constructor simd

1
推荐指数
2
解决办法
121
查看次数

如何优化长系列的If/then条件表达式 - SIMD

我正在使用SIMD来提高C代码的性能,但我遇到了一个带有很多if/then条件的函数,如下所示:

if (Di <= -T3) return  -4;
if (Di <= -T2) return  -3;
if (Di <= -T1) return  -2;
if (Di < -NEAR)  return  -1;
if (Di <=  NEAR) return   0;
if (Di < T1)   return   1;
if (Di < T2)   return   2;
if (Di < T3)   return   3;

return  4;
Run Code Online (Sandbox Code Playgroud)

使用VC++编译器支持的Intel内部函数可以缩短处理时间.

那么有没有更好的方法来优化这一长串的条件表达式?

c c++ optimization conditional simd

1
推荐指数
1
解决办法
201
查看次数

使用4个单独的双倍加载x64 ymm寄存器的有效方法是什么?

加载x64 ymm寄存器的最有效方法是什么?

  1. 4个均匀间隔的双倍,即一组连续的双打

    0  1  2  3  4  5  6  7  8  9 10 .. 100
    And i want to load for example 0, 10, 20, 30
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在任何位置都有4次加倍

    i.e. i want to load for example 1, 6, 22, 43
    
    Run Code Online (Sandbox Code Playgroud)

64-bit x86 assembly x86-64 simd

1
推荐指数
1
解决办法
819
查看次数

SSE的条件语句

我正在尝试为我的游戏做一些计算,我正在尝试计算两点之间的距离.基本上,我正在使用圆的方程来查看这些点是否在我定义的半径范围内.

(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)

一旦我得到结果变量,我就迷路了.我如何使用刚刚得到的结果变量?我的计划是,如果评估的条件证明是真的,做一些光照计算,然后在屏幕上绘制像素.在这种情况下,我如何解释真实与虚假?

任何有关正确方向的帮助都非常感谢!

c++ conditional sse simd intrinsics

1
推荐指数
1
解决办法
717
查看次数

我可以使用AVX/SSE调配AoS布局而不是SoA吗?

我想加速一个简单的积分器,它根据位置和速度描述一组无质量粒子.我不是SSE/AVX专家,但我觉得有趣的是SIMD扩展可以在这里产生什么.

许多论文建议使用数组结构:

struct {
  static float2 xy[OUGHTA_BE_ENOUGH];
  static float2 vxvy[OUGHTA_BE_ENOUGH];
} Particles;

// in main loop:
Particles.xy[i] += time_delta * Particles.vxvy[i];
Run Code Online (Sandbox Code Playgroud)

但是,对于许多应用来说,相反的方法是有益的:

struct {
  float2 xy;
  float2 vxvy;
} Particle;

// in main loop:
particles[i].xy += time_delta * particles[i].vxvy;
Run Code Online (Sandbox Code Playgroud)

虽然我模糊地理解要搜索什么来矢量化数组结构版本,但我怀疑有没有办法将SIMD与结构数组版本一起使用,因为字段访问或"调配".

是否有任何技术可以使用SIMD进行上述计算,或者我错过了内在函数?

c++ sse simd vectorization avx

1
推荐指数
1
解决办法
283
查看次数

从比特流中提取10位字

我需要从原始比特流中提取所有10位单词 ABACABACABAC...

它已经可以与天真的C实现一起使用,例如

for(uint8_t *ptr = in_packet; ptr < max; ptr += 5){
    const uint64_t val =
        (((uint64_t)(*(ptr + 4))) << 32) |
        (((uint64_t)(*(ptr + 3))) << 24) |
        (((uint64_t)(*(ptr + 2))) << 16) |
        (((uint64_t)(*(ptr + 1))) <<  8) |
        (((uint64_t)(*(ptr + 0))) <<  0) ;

    *a_ptr++ = (val >>  0);
    *b_ptr++ = (val >> 10);
    *a_ptr++ = (val >> 20);
    *c_ptr++ = (val >> 30);
}
Run Code Online (Sandbox Code Playgroud)

但是性能对于我的应用程序来说是不够的,因此我想使用一些AVX2优化来改善它。

我访问了网站https://software.intel.com/sites/landingpage/IntrinsicsGuide/#,以找到可以提供帮助的任何功能,但似乎没有任何功能可用于10位字,只有8位或16位字。这似乎是合乎逻辑的,因为10位不是处理器固有的,但对我来说却很难。

有什么方法可以使用AVX2解决此问题?

c optimization simd bit-packing avx2

1
推荐指数
1
解决办法
174
查看次数