标签: simd

将3D数学转换为SSE或其他SIMD需要多少加速?

我在我的应用程序中广泛使用3D数学.通过将矢量/矩阵库转换为SSE,AltiVec或类似的SIMD代码,我可以实现多少加速?

optimization x86 sse native simd

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

如何使用128位C变量和xmm 128位asm?

在gcc中,我想通过asm代码做一个带有2个C变量的128位xor:怎么做?

asm (
    "movdqa %1, %%xmm1;"
    "movdqa %0, %%xmm0;"
     "pxor %%xmm1,%%xmm0;"
     "movdqa %%xmm0, %0;"

    :"=x"(buff) /* output operand */
    :"x"(bu), "x"(buff)
    :"%xmm0","%xmm1"
    );
Run Code Online (Sandbox Code Playgroud)

但我有一个分段错误错误; 这是objdump输出:

movq   -0x80(%rbp),%xmm2

movq   -0x88(%rbp),%xmm3

movdqa %xmm2,%xmm1

movdqa %xmm2,%xmm0

pxor   %xmm1,%xmm0

movdqa %xmm0,%xmm2

movq   %xmm2,-0x78(%rbp)
Run Code Online (Sandbox Code Playgroud)

c sse simd

10
推荐指数
2
解决办法
9404
查看次数

SSE2:双精度日志功能

我需要开源(没有许可限制)日志功能的实现,有签名的东西

__m128d _mm_log_pd(__m128d);
Run Code Online (Sandbox Code Playgroud)

它可以在英特尔短矢量数学库(ICC的一部分)中使用,但ICC既不是免费的也不是开源的.我正在寻找仅使用内在函数的实现.

它应该使用特殊的有理函数近似.我需要的东西几乎与cmath日志一样准确,比如9-10十进制数字,但更快.

c c++ optimization sse simd

10
推荐指数
2
解决办法
2526
查看次数

C#矢量化阵列加法

无论如何以SIMD方式"向量化"跨数组的元素添加?

例如,我想转:

var a = new[] { 1, 2, 3, 4 };
var b = new[] { 1, 2, 3, 4 };
var c = new[] { 1, 2, 3, 4 };
var d = new[] { 1, 2, 3, 4 };

var e = new int[4];

for (int i = 0; i < a.Length; i++)
{
    e[i] = a[i] + b[i] + c[i] + d[i];
}

// e should equal { 4, 8, 12, 16 }
Run Code Online (Sandbox Code Playgroud)

变成这样的东西:

var e …
Run Code Online (Sandbox Code Playgroud)

.net c# simd vectorization

10
推荐指数
2
解决办法
4776
查看次数

检查XMM寄存器是否全部为零

有没有办法检查__m128i变量中的所有位/字节/字等是否为0?
在我的应用程序中,我必须检查__m128i变量中包含的所有整数是否为零.我是否必须提取它们并分别进行比较?

编辑:


我现在在做的是:

int next = 0;
do{
    //some code

    next = idata.m128i_i32[0] + idata.m128i_i32[1] + idata.m128i_i32[2] + idata.m128i_i32[3];
}while(next > 0);
Run Code Online (Sandbox Code Playgroud)

我需要的是检查idata是否全为零而不必访问每个单独的元素,如果它们是...则退出循环...

基于Harold的评论,这是解决方案:


__m128i idata = _mm_setr_epi32(i,j,k,l);
do{
    //some code
}while( !_mm_testz_si128(idata, idata) );
Run Code Online (Sandbox Code Playgroud)

如果idata中每个DW的所有低位都为0,这将退出循环...感谢hraold!

c++ simd intrinsics

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

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

在这里读到英特尔SSE 4.2 instructions为加速字符串处理而推出的.

从文章引用:

SSE 4.2指令集首先在Intel的Core i7中实现,提供了字符串和文本处理指令(STTNI),它们利用SIMD操作处理字符数据.虽然最初设想用于加速字符串,文本和XML处理,但这些指令的强大新功能在这些域之外是有用的,值得重新审视众多应用程序的搜索和识别阶段,以利用STTNI来提高性能

  • gcc是否可以使用这些说明?
  • 如果是这样,哪个版本?
  • 如果没有,是否有任何开源库提供此功能?

c c++ gcc sse simd

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

SIMD延迟吞吐量

在针对大多数说明的英特尔Intrisics指南中,它还具有延迟和吞吐量的值.例:

__m128i _mm_min_epi32

Performance
Architecture Latency Throughput
Haswell      1       0.5
Ivy Bridge   1       0.5
Sandy Bridge 1       0.5
Westmere     1       1
Nehalem      1       1
Run Code Online (Sandbox Code Playgroud)

这些数字究竟是什么意思?我认为较慢的延迟意味着命令执行时间较长,但Nehalem的吞吐量1和常春藤的0.5,意味着Nehalem的命令更快?

c++ performance x86 sse simd

10
推荐指数
2
解决办法
2307
查看次数

C++为SIMD设计:使SoA不再是PiTA

苦乐参半的SoAs

我最近看到了使用手工编写的SIMD内在函数与SoA(数组结构)表示的乐趣.

与我之前的AoS(结构阵列)代码相比,速度的改进,至少对于简单的顺序型流媒体操作而言,在加倍到三倍的速度增加时几乎没有什么惊人的.作为奖励,它简化了逻辑,除了减少内存使用外,还排除了那些棘手的水平操作和混乱组件.

然而,之后有这种苦乐参半的感觉,我意识到他们在代码中使用的是什么PITA,尤其是界面设计.

中级接口设计

我经常处理设计中级接口.它们比视频游戏中的级别更高std::vector,但比级别更低Monster.这些对我来说总是一些最笨拙的接口设计和保持稳定,因为它们不足以提供与标准C++容器一样的简单读/写接口.然而,它们不够高级(在界面的入口点缺乏足够的逻辑)来完全隐藏和抽象出底层表示,只提供高级操作.

我认为中级设计的一个例子是可编程粒子系统API,它希望在某些场景下尽可能高效和可扩展,同时便于休闲场景(例如脚本编写者).这样的设计必须提供粒子访问,除非它将为每个可能的算法提供与可想象的粒子相关的方法,否则它必须在某个地方暴露一些原始的SoA细节,让客户从中受益.

设计也不一定要求始终写入SoA类型代码.日常使用量越多,对便利性,简单性,生产率的要求仍然不高.它仅适用于那些罕见的,性能关键的场景,其中底层的SoA表示派上用场.

那么API/lib设计师和大型系统人员如何处理这些需求的平衡呢?

平衡多种访问模式

由于SoA消除了任何每个元素的结构,因此当用户nth使用接口的更方便的随机访问部分访问元素时,动态实例化结构/类可能是一个不错的主意吗?也许一个结构包含指向多个SoA数组的第n个条目的指针/引用以进行可变访问?

此外,如果更常见的使用模式是更多随机访问标量逻辑而不是顺序访问SIMD向量逻辑,但SIMD部分被触发足以使其更好地仅使用一个数据结构,可能这种混合SoA表示更好地平衡了所有需求?

struct AoSoA
{
    ALIGN16 float x[4];
    ALIGN16 float y[4];
    ALIGN16 float z[4];
};
ALIGN16 AoSoA elements[n/4];
Run Code Online (Sandbox Code Playgroud)

我不明白高速缓存行的本质,以便知道这种表示是否值得.我注意到它对顺序SIMD情况没有多大帮助,我们可以将全部资源用于一个庞大的算法,但似乎它可能对需要跨组件或随机访问的大量水平逻辑的情况有帮助标量逻辑情况,系统可能同时执行许多其他操作.

无论如何,我一般都在寻求深入了解如何有效地设计具有SoA后端表示的中间层数据结构接口作为实现细节,而不会将复杂性转移到客户端,除非他们真的需要它.

我真的想避免强迫客户端总是在每个使用界面的地方编写SoA类型的代码,除非他们确实需要这种效率,我很好奇如何平衡那些更多的日常随机访问标量使用场景与利用SoA表示的罕见但不太常见的场景.

c++ architecture optimization simd

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

两个256位整数的按位xor

我有一个AVX CPU(不支持AVX2),我想计算两个256位整数的按位xor.

由于_mm256_xor_si256仅在AVX2上可用,我可以将这256位加载为__m256使用_mm256_load_ps,然后执行a _mm256_xor_ps.这会产生预期的结果吗?

我主要担心的是,如果内存内容不是有效的浮点数,_mm256_load_ps那么寄存器中的位不会与寄存器中的位完全相同吗?

谢谢.

sse simd avx

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

SSE,AVX不缺少?

这是我的想象力,还是PNOTSSE和AVX失踪的指令?也就是说,翻转向量中的每一位的指令.

如果是,是否有比PXOR使用所有1的向量更好的模拟方法?非常烦人,因为我需要设置所有1的向量来使用该方法.

x86 sse simd avx

9
推荐指数
3
解决办法
1409
查看次数

标签 统计

simd ×10

sse ×7

c++ ×5

c ×3

optimization ×3

x86 ×3

avx ×2

.net ×1

architecture ×1

c# ×1

gcc ×1

intrinsics ×1

native ×1

performance ×1

vectorization ×1