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