如何检查我的Linux Box安装安装是否具有SSE指令功能?
我正在尝试安装libjpeg-turbo,我想确保它充分利用我的盒子的功能.
我正在使用NEON SIMD指令编写Android应用程序的一部分,目标是Cortex A8处理器.根据这篇参考手册,NEON支持16位和32位浮点数,即float16_t和float32_t.当我尝试使用float16_t它及其所有相关的矢量类型时,我得到一个错误,说这种类型是未声明的.在查看内容时arm_neon.h,我发现这种类型确实是未声明的.
是否有一个原因?ARM的高级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,那么整体性能并不是更好,但等待在每次访问之间平均分配,而不是仅仅按第一次访问.
数据必须是16字节对齐的,以便SSE指令可以处理它而不会出现分段错误吗?我试过的编译器是带有选项的gcc -msse2.我想_mm_cmpgt_epi32用来比较一个大的int数组.我发现它不能在数组的任何位置执行,除了下标为4的倍数的位置.
在MSDN RyuJIT博客中给出了这样的指令设置CTP3:
在RyuJIT最终之前需要一些棘手的事情:将一个对Microsoft.Numerics.Vectors.Vector的引用添加到将在使用新Vector类型的方法之前调用的类构造函数.我建议把它放在程序的入门类的构造函数中.它必须出现在类构造函数中,而不是实例构造函数中.
我对Objective-C中的类/实例构造比我在C#中更精通.他在谈论一个不同的概念吗?C#中的类构造函数和实例构造函数有什么区别?在这种情况下,"类构造函数"只是无参数构造函数吗?
我正在使用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内部函数可以缩短处理时间.
那么有没有更好的方法来优化这一长串的条件表达式?
加载x64 ymm寄存器的最有效方法是什么?
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)在任何位置都有4次加倍
i.e. i want to load for example 1, 6, 22, 43
Run Code Online (Sandbox Code Playgroud)我正在尝试为我的游戏做一些计算,我正在尝试计算两点之间的距离.基本上,我正在使用圆的方程来查看这些点是否在我定义的半径范围内.
(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)
一旦我得到结果变量,我就迷路了.我如何使用刚刚得到的结果变量?我的计划是,如果评估的条件证明是真的,做一些光照计算,然后在屏幕上绘制像素.在这种情况下,我如何解释真实与虚假?
任何有关正确方向的帮助都非常感谢!
我想加速一个简单的积分器,它根据位置和速度描述一组无质量粒子.我不是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进行上述计算,或者我错过了内在函数?
我需要从原始比特流中提取所有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解决此问题?
simd ×10
sse ×5
c++ ×4
c ×3
conditional ×2
optimization ×2
x86 ×2
64-bit ×1
android ×1
arm ×1
assembly ×1
avx ×1
avx2 ×1
bit-packing ×1
c# ×1
constructor ×1
gcc ×1
intrinsics ×1
libjpeg ×1
linux ×1
neon ×1
x86-64 ×1