相关疑难解决方法(0)

在x86上做水平浮点矢量和的最快方法

你有一个三(或四)个浮点数的向量.总结它们的最快方法是什么?

SSE(movaps,shuffle,add,movd)总是比x87快吗?SSE4.2中的水平加法说明值得吗?移动到FPU的成本是多少,然后是faddp,faddp?什么是最快的特定指令序列?

"尝试安排事情,这样你可以一次总结四个向量"将不被接受作为答案.:-)

floating-point optimization x86 assembly sse

41
推荐指数
4
解决办法
2万
查看次数

使用SSE/AVX内在函数的快点产品

我正在寻找一种快速计算含有3或4个成分的向量的点积的方法.我尝试了几件事,但大多数在线示例都使用了一系列浮点数,而我们的数据结构却不同.

我们使用16字节对齐的结构.代码摘录(简化):

struct float3 {
    float x, y, z, w; // 4th component unused here
}

struct float4 {
    float x, y, z, w;
}
Run Code Online (Sandbox Code Playgroud)

在之前的测试中(使用SSE4点积本征或FMA)与使用以下常规c ++代码相比,我无法获得加速.

float dot(const float3 a, const float3 b) {
    return a.x*b.x + a.y*b.y + a.z*b.z;
}
Run Code Online (Sandbox Code Playgroud)

在英特尔Ivy Bridge/Haswell上使用gcc和clang进行测试.似乎花费时间将数据加载到SIMD寄存器并再次将其拉出会消耗所有的好处.

我将非常感谢一些帮助和想法,如何使用我们的float3/4数据结构有效地计算点积.SSE4,AVX甚至AVX2都没问题.

提前致谢.

c++ gcc simd clang

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

sse2浮点乘法

我试图将一些代码从FANN Lib(用C语言编写的神经网络)移植到SSE2.但是SSE2的性能比普通代码差.使用我的SSE2实现运行一次运行需要5.50分钟而不需要5.20分钟.

SSE2怎么能比正常运行慢?可能是因为_mm_set_ps?我使用Apple LLVM编译器(XCode 4)编译代码(所有SSE扩展标志都打开,优化级别为-Os).

没有SSE2的代码

                neuron_sum +=
                fann_mult(weights[i], neurons[i].value) +
                fann_mult(weights[i + 1], neurons[i + 1].value) +
                fann_mult(weights[i + 2], neurons[i + 2].value) +
                fann_mult(weights[i + 3], neurons[i + 3].value);
Run Code Online (Sandbox Code Playgroud)

SSE2代码

                __m128 a_line=_mm_loadu_ps(&weights[i]);
                __m128 b_line=_mm_set_ps(neurons[i+3].value,neurons[i+2].value,neurons[i+1].value,neurons[i].value);
                __m128 c_line=_mm_mul_ps(a_line, b_line);
                neuron_sum+=c_line[0]+c_line[1]+c_line[2]+c_line[3];
Run Code Online (Sandbox Code Playgroud)

c performance sse2 fann

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

标签 统计

assembly ×1

c ×1

c++ ×1

clang ×1

fann ×1

floating-point ×1

gcc ×1

optimization ×1

performance ×1

simd ×1

sse ×1

sse2 ×1

x86 ×1