Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang组装工具的_mm_add_epi32_Go_Assembly_X86_Sse_Simd - Fatal编程技术网

Golang组装工具的_mm_add_epi32

Golang组装工具的_mm_add_epi32,go,assembly,x86,sse,simd,Go,Assembly,X86,Sse,Simd,我正在尝试在golang assembly中实现\u mm\u add\u epi32,可以选择借助。但我对组装知之甚少,甚至不知道如何开始组装。你能给我一些代码提示吗?谢谢大家 这是等效的较慢的golang版本: func add(x, y []uint32) []uint32 { if len(x) != len(y) { return nil } result := make([]uint32, len(x)) for i := 0; i

我正在尝试在golang assembly中实现
\u mm\u add\u epi32
,可以选择借助。但我对组装知之甚少,甚至不知道如何开始组装。你能给我一些代码提示吗?谢谢大家

这是等效的较慢的golang版本:

func add(x, y []uint32) []uint32 {
    if len(x) != len(y) {
        return nil
    }

    result := make([]uint32, len(x))
    for i := 0; i < len(x); i++ {
        result[i] = x[i] + y[i]
    }
    return result
}

func add(x,y[]uint32][]uint32{
如果len(x)!=len(y){
归零
}
结果:=make([]uint32,len(x))
对于i:=0;i

我知道我们需要的是指令
paddq xmm,xmm
,但不知道如何将
[]字节的一个片段转换为256位寄存器
YMM

下面是这样一个加法函数的示例:

    // func add(x, y [8]int32) [8]int32
    // q = x + y
TEXT ·add(SB),0,$0
    VMOVDQU x+0(FP), Y0
    VPADDD  Y+32(FP), Y0, Y0
    VMOVDQU Y0, q+64(FP)
    VZEROUPPER
    RET
在阅读此代码之前,请先熟悉以下内容。不幸的是,Go样式的装配(也称为Plan 9样式的装配)缺乏文档记录

数组按值在堆栈上传递。返回值作为调用者读回的最右边的额外参数传递。使用我链接到access函数参数的文档中记录的
(FP)

除此之外,这很简单。语法与AT&T语法相似(但不相等)。请注意,寄存器名称不同,必须提供大小后缀


如您所见,为单个操作编写汇编函数是毫无意义的。采用您需要的算法并完全在汇编中编写可能会更好。

您拥有的函数与
\u mm\u add\u epi32
稍有不同,因为它需要任意长度的切片。这是有意的吗?感谢您的回复,使用
[]uint32
[8]uint32
都可以,第一个是为了保持数据结构与函数调用方的一致性。支持任意长度的切片会使代码变得相当复杂,因此最好从这两种代码中选择一种,这样我就可以编写答案了。
[8]uint32
足够好了,提前谢谢你。非常感谢,我会尽快给你反馈。谢谢@fuz,它很管用!!!>如您所见,为单个操作编写汇编函数是毫无意义的。你是对的,实际上我已经优化了我应用程序的其他部分,这看起来像是最后一个可以优化的部分,所以我尝试了这个。非常感谢。@WeiShen如果您发布更多的上下文,我可能会提供更好的优化建议。请随意提出一个新问题,并将其链接到此处,以便我可以找到它。还可以考虑使用<代码> GO工具PPROF查找应用程序的哪些部分实际上与性能相关。是的,我使用PPROF很多。下面是[pprof result]()@WeiShen换行符不幸不允许出现在注释中,因此您的代码部分非常混乱。如果你能告诉我你想在什么环境下使用这个功能,我可能会提供更好的优化建议。正如我之前所说的,最好是提出一个新的问题。