小编Joh*_*ith的帖子

位向量和浮点向量的快点产品

我试图在i7上以最有效的方式计算浮点数和位向量之间的点积.实际上,我在128或256维向量上进行此操作,但为了说明,让我编写64维代码来说明问题:

// a has 64 elements. b is a bitvector of 64 dimensions.
float dot(float *restrict a, uint64_t b) {
    float sum = 0;
    for(int i=0; b && i<64; i++, b>>=1) {
        if (b & 1) sum += a[i];
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

当然,这是有效的,但问题是,这是整个程序的时间要点(占用50分钟运行的95%CPU时间)所以我迫切需要让它更快.

我的猜测是上面的分支是游戏杀手(防止无序执行,导致坏分支预测).我不确定矢量指令是否可以在这里使用和帮助.使用gcc 4.8和-std = c99 -march = native -mtune = native -Ofast -funroll-loops,我现在得到这个输出

    movl    $4660, %edx
    movl    $5, %ecx
    xorps   %xmm0, %xmm0
    .p2align 4,,10
    .p2align 3
.L4:
    testb   $1, %cl
    je  .L2
    addss   (%rdx), %xmm0
.L2:
    leaq …
Run Code Online (Sandbox Code Playgroud)

c optimization assembly sse x86-64

19
推荐指数
3
解决办法
2841
查看次数

Go中地图的内存开销

map [byte] byte {0:10}应该使用至少2个字节,一个用于值,一个用于每个键.但是,作为每个hashmap的实现,每个项目也有隐藏的成本.gccgo和gc中Go映射中每个条目的内存开销是多少?

hashmap go

7
推荐指数
2
解决办法
5750
查看次数

标签 统计

assembly ×1

c ×1

go ×1

hashmap ×1

optimization ×1

sse ×1

x86-64 ×1