精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-22
最后修改:2010-02-23
ubuntu+gcc4.3 ,尝试修改 google.sparsetable 中的 sparsegroup,修改完成,不启用 -mpopcnt,sparsetable_unittest 和 hashtable_unittest 都通过了。启用-mpopcnt以后,发现硬件不支持,报非法指令错误,公司的电脑太烂了! 换到服务器上,是64位至强,gcc4.1.2,启用 -mpopcnt 再加 -O1/-O2/-O3 任何一个,导致编译失败:internal compiler error: in memory_address_length, at config/i386/i386.c:13816 呜呼! 反复尝试后发现,如果把 __builtin_popcountl 包装进一个 __attribute__((noinline)) 函数就可以编译过了: 然而这样得到的测试结果只比软件实现的 popcount 快20%:
在工作电脑上(32位奔腾M),还发现,__builtin_popcount l 会生成硬件 popcount 指令,而 __builtin_popcount ll 不会,这是gcc4.3呀,很新的版本了!不得已,自己再写一下: 这个实现版明显要比软__builtin_popcount ll 快很多。 另外,visual C++ 也支持popcount,我只在 visual c++ 2008 的文档中找到:
明显比 gcc 要罗嗦很多,而且有不同的 popcount 版本,文档中还建议先使用__cpuid 测试硬件是否支持popcount。 我修改过的sparsetable 在这里
################################################################ 2010-02-23 新增以下内容: ################################################################ 在服务器上编译了gcc4.4.3,虽然费了一番周折,最后却也成功了。 使用gcc4.4.3 带 -mpopcnt -O2 编译、测试被我修改过 sparsegroup 的 sparsehash,结果如下: Tables <!-- "G_PLUGIN_FOR_HTML" --> tt { font-family: courier; } td { font-family: helvetica, sans-serif; } caption { font-family: helvetica, sans-serif; font-size: 14pt; text-align: left; }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-23
都是硬件指令支持不全的缘故啊。。。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-23
在这种情况下,还是虚拟机好,总是可以选择最优实现。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-24
febird 写道 在这种情况下,还是虚拟机好,总是可以选择最优实现。
前提是,你的虚拟机知道要用popcnt。。。这个JIT已经强悍到一定程度了 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-28
Popcnt还是很新的指令,要sse4.2才支持,我家里的几台pc都不支持。你的fast_popcount不能inline还是有性能损失的,最好直接嵌入汇编
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-28
mikeandmore 写道 febird 写道 在这种情况下,还是虚拟机好,总是可以选择最优实现。
前提是,你的虚拟机知道要用popcnt。。。这个JIT已经强悍到一定程度了 最新的hotspot代码已经能支持popcnt了,其实并不复杂,将Integer.bitCount,和Long.bitCount注册为intrinsics就可以了 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-28
wkoffee 写道 mikeandmore 写道 febird 写道 在这种情况下,还是虚拟机好,总是可以选择最优实现。
前提是,你的虚拟机知道要用popcnt。。。这个JIT已经强悍到一定程度了 最新的hotspot代码已经能支持popcnt了,其实并不复杂,将Integer.bitCount,和Long.bitCount注册为intrinsics就可以了 谁可以改一个java版的 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-02-28
wkoffee 写道 Popcnt还是很新的指令,要sse4.2才支持,我家里的几台pc都不支持。你的fast_popcount不能inline还是有性能损失的,最好直接嵌入汇编
sse4已经支持popcnt,到 sse4.2 又有了不同的popcnt指令,不知道啥原因,gcc中有生成旧popcnt还是新popcnt指令的选项 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
浏览 4141 次