rime / librime

Rime Input Method Engine, the core library
https://rime.im
BSD 3-Clause "New" or "Revised" License
3.44k stars 562 forks source link

各平臺table.bin通用問題 #121

Open osfans opened 7 years ago

osfans commented 7 years ago

最近移植了armv8 64位的librime,發現bin跟armv7 32位的也不通用。

有沒有辦法讓各平臺bin通用?是字節序還是位數的問題? 實在不行,要不搞個bin轉換工具?

@Bambooin @lotem

zhaozg commented 7 years ago

只能针对不同平台进行编译,不具有二进制可移植性,也就不存在什么转换工具

osfans commented 7 years ago

發現文件大小是相同的,應該有辦法直接轉換。@zhaozg 我說的是方案部署生成的bin。

lotem commented 7 years ago

上 flatbuffers,應該就能通用了。

osfans commented 7 years ago

你估計是哪塊不通用?leveldb?我想做個各平臺bin轉換的腳本。

lotem commented 7 years ago

也許浮點數的格式不一樣,這是最麻煩的

Prcuvu commented 7 years ago

这个问题最严重的地方在于,由于iOS第三方输入法有内存限制,iRime无法部署,只能从外部导入bin。而x86架构生成的bin无法在iOS设备上使用,推测应该是只能导入ARM生成的bin。但是没有安卓手机的用户无法通过同文生成这样的bin,这样就会很麻烦。 我认为应该严格规范bin使用的数据结构,确保在不同架构上都兼容。

Prcuvu commented 7 years ago

發現文件大小是相同的,應該有辦法直接轉換。

看来可以通过diff看出大概。

lotem commented 7 years ago

浮點數不同。這個可以解決。不用就是了,轉換成整數。 誰能研究一下,merisa 生成的文件是不是跨平臺的。代碼比較複雜,需要做個實驗。

osfans commented 7 years ago

@Prcuvu 那iRime現在是從哪導入bin的?

lotem commented 7 years ago

@osfans 可否做個實驗,在不同架構下調用 libmerisa 生成的文件是否全等

osfans commented 7 years ago

http://s-yata.github.io/marisa-trie/docs/readme.en.html

Cross-architecture compatibility

The dictionary format of libmarisa depends on the architecture. Dictionaries built on a little endian architecture don't work on a big endian architecture. Also, on a big endian architecture, dictionaries built on a 32-bit machine don't work on a 64-bit machine and vise versa. On a little endian architecture, dictionaries are compatible on 32/64-bit machines.

看來有希望。目前windows、linux、android、ios都是小端序的?而且32位和64位應該通用。

osfans commented 7 years ago

经测试,marisa-build txt > bin在x86、armv7、arm64上生成的文件全等。

zgdlwcime commented 7 years ago

搞好了吗,有新版了吗?

osfans commented 7 years ago

@lotem https://github.com/rime/librime/blob/master/src/rime/dict/mapped_file.h#L133 https://github.com/rime/librime/blob/master/src/rime/dict/table.h#L43 這邊有#if defined(__arm__) 註釋掉之後,arm 32位和64位的bin基本上差不多了。看來64位沒有定義arm

lotem commented 7 years ago

喔這是當時添加 ARM 支持的時候,不想破壞已有 x86 下詞典文件的二進制兼容才做條件編譯的。 現在改成統一對齊吧。 但是我不知道不同架構下對齊方式會不會有差異。還需要驗證的。

另外浮點數有人研究過嘛?

osfans commented 7 years ago

噢,這樣啊,我改了之後,arm32和arm64兼容了。

https://github.com/rime/librime/blob/555f9906d3d97fcb284ab2b9fe38d94923a66729/src/rime/dict/mapped_file.h#L133-L136

這一段RIME_ALIGNED不知要不要統一? android上測試是沒有問題。 統一用float不用double也沒有問題。

lotem commented 7 years ago

@osfans 我的意見是,先驗證能否做到完全的二進制兼容。代碼統一不代表不同架構下的二進制兼容。如果不能,反而破壞了某一架構下的前後版本兼容,那統一一處代碼就不值得做了。 osfans 能幫忙做這個實驗嘛?

osfans commented 7 years ago

@lotem 測試了下librime中的minimal,arm v7和v8都不#define __arm__,生成的bin可以通用。

六個bin中,cangjie5.prism.bin cangjie5.reverse.bin cangjie5.table.bin luna_pinyin.prism.bin 四個完全相同。luna_pinyin.reverse.bin luna_pinyin.table.bin這兩個略有差異。


--- v7/reverse.txt  2017-09-06 13:14:07.991668050 +0800
+++ v8/reverse.txt  2017-09-06 13:14:26.671626626 +0800
@@ -6887,7 +6887,7 @@
 001cd90 aea4 88bf a79a 988b b9b3 9288 b3b0 bda8
 001cda0 b984 b681 b292 9e90 bc82 908f a989 a49c
 001cdb0 b6a5 b283 b184 8d8a 9183 0000 0008 0000
-001cdc0 0000 0000 bf96 a300 0000 0000 0000 0000
+001cdc0 0000 0000 0000 0000 0000 0000 0000 0000
 001cdd0 0000 0000 0018 0000 0000 0000 0000 0000
 001cde0 0000 0000 0000 0000 0000 0000 0000 0000
 *
@@ -6906,7 +6906,7 @@
 001cec0 0000 0000 0000 0000 0000 0000 0019 0000
 001ced0 0000 0000 4600 4043 3a3d 3437 2d30 272a
 001cee0 2124 1b1e 1518 0f12 090c 0306 0000 0000
-001cef0 0000 0000 0008 0000 0000 0000 bf96 a300
+001cef0 0000 0000 0008 0000 0000 0000 0000 0000
 001cf00 0000 0000 0000 0000 0000 0000 0018 0000
 001cf10 0000 0000 0049 0000 0000 0000 bf96 a300
 001cf20 00bb b7a5 9200 00b2 b0b1 9700 00a9 a8a5
@@ -7595,7 +7595,7 @@
 001f9e0 7165 6703 6b68 6961 695b 985b 3875 3a61
 001f9f0 253c 2f47 357a 414a 6c61 6c79 a99b 7870
 001fa00 974a 6f71 44b4 7975 3674 7814 3e73 6942
-001fa10 0000 0000 0008 0000 0000 0000 7a20 7500
+001fa10 0000 0000 0008 0000 0000 0000 0000 0000
 001fa20 0000 0000 0000 0000 0000 0000 00d7 0000
 001fa30 0000 0000 0000 0000 0000 0000 0000 0000
 *
@@ -7627,7 +7627,7 @@
 001fbf0 2f6b 5aad babf 2068 b020 6320 6a71 69a7
 001fc00 7566 9a67 946a 6803 337f 6568 7a4c 2020
 001fc10 8861 6a54 6120 2029 6f73 0000 0008 0000
-001fc20 0000 0000 7a20 7500 0000 0000 0000 0000
+001fc20 0000 0000 0000 0000 0000 0000 0000 0000
 001fc30 0000 0000 003d 0000 0000 0000 00c8 0000
 001fc40 0000 0000 7a20 7500 7920 6400 6e61 6820
 001fc50 2075 0078 6e61 7820 6900 6a20 6569 7820

--- v7/table.txt    2017-09-06 13:14:18.961643738 +0800
+++ v8/table.txt    2017-09-06 13:14:24.714964304 +0800
@@ -535759,7 +535759,7 @@
 082e160 7b06 9ec9 a2e1 9e8a 198a b0c0 2c04 521c
 082e170 c323 1461 60f4 c280 4a58 3813 2610 218a
 082e180 4306 00d2 4282 45e5 1b08 9719 d09a 95ca
-082e190 61f0 b17e e71e 00ad 0000 0000 0007 0000
+082e190 61f0 b17e 001e 0000 0000 0000 0007 0000
 082e1a0 007f 0000 218a 0000 0000 0000 51eb 0000
 082e1b0 0000 0000 bd83 bde4 e9bf bc00 e9bf 8a00
 082e1c0 e9bd bc00 e9bb e500 ba9f 00e9 b9ae 00e9
osfans commented 7 years ago

@lotem 驗證了 #156 arm 32(v7)和 64(v8)可以通用,6個bin文件有三個不同。

--- arm-32/cangjie5.reverse.txt 2017-10-25 20:47:40.638676513 +0800
+++ arm-64/cangjie5.reverse.txt 2017-10-25 20:48:18.345120039 +0800
@@ -148140,7 +148140,7 @@
 024cd10 8e98 590f e496 0f18 8803 821c 925a 7359
 024cd20 11ce a000 23e3 a4a8 0892 f20e 0f90 9241
 024cd30 a564 a521 4a4b 7405 e1c0 c8f8 f7f2 8f2c
-024cd40 3c75 53c7 833c 59a5 8963 2021 0000 0000
+024cd40 3c75 53c7 833c 59a5 8963 0021 0000 0000
 024cd50 0006 0000 003f 0000 ea04 0000 0000 0000
 024cd60 0000 0000 0000 0000 0000 0000 0000 0000
 *
@@ -150303,7 +150303,7 @@
 02554c0 3865 9837 8a13 441c 298e 8801 e101 cf73
 02554d0 6530 6416 0569 9904 2912 7591 1ad4 a850
 02554e0 d464 cc5b 96ac 10d4 a481 5893 6901 e399
-02554f0 05c0 6dc0 0000 0000 0005 0000 001f 0000
+02554f0 0000 0000 0000 0000 0005 0000 001f 0000
 0255500 074e 0000 0000 0000 1245 0000 0000 0000
 0255510 7a20 7600 0079 7973 7900 7920 7972 6c00
 0255520 0079 7969 2000 6568 0079 7964 6300 0079

--- arm-32/luna_pinyin.table.txt    2017-10-25 20:36:53.069175857 +0800
+++ arm-64/luna_pinyin.table.txt    2017-10-25 20:36:43.782564164 +0800
@@ -525187,7 +525187,7 @@
 0804c90 c21d 0062 01f5 311c c36a 813a 2c15 71ec
 0804ca0 70e8 8dd4 ec75 b058 f873 1570 78ac 0b10
 0804cb0 7c02 4f88 be15 107d 5596 9110 1a07 81c4
-0804cc0 2110 f2d2 10f1 3c16 cb5a e21e 9123 b174
+0804cc0 2110 f2d2 10f1 3c16 cb5a e21e 0003 0000
 0804cd0 0000 0000 0009 0000 01ff 0000 8f6b 0003
 0804ce0 0000 0000 0000 0000 0000 0000 0000 0000
 *
@@ -535759,7 +535759,7 @@
 082e160 7b06 9ec9 a2e1 9e8a 198a b0c0 2c04 521c
 082e170 c323 1461 60f4 c280 4a58 3813 2610 218a
 082e180 4306 00d2 4282 45e5 1b08 9719 d09a 95ca
-082e190 61f0 b17e 8e9e 0000 0000 0000 0007 0000
+082e190 61f0 b17e 001e 0000 0000 0000 0007 0000
 082e1a0 007f 0000 218a 0000 0000 0000 51eb 0000
 082e1b0 0000 0000 bd83 bde4 e9bf bc00 e9bf 8a00
 082e1c0 e9bd bc00 e9bb e500 ba9f 00e9 b9ae 00e9

--- arm-32/luna_pinyin.reverse.txt  2017-10-25 20:47:32.218726342 +0800
+++ arm-64/luna_pinyin.reverse.txt  2017-10-25 20:48:22.038431516 +0800
@@ -6860,7 +6860,7 @@
 001cbd0 673b 2063 b39f 8cb4 8e8d 9994 9e9a afae
 001cbe0 bcba 88be a78f b6a8 a8a6 8c8b a98c 9183
 001cbf0 a8a7 9fb1 a8a8 adac b2b1 b991 b185 b49e
-001cc00 0000 0000 0008 0000 0000 0000 9798 b15b
+001cc00 0000 0000 0008 0000 0000 0000 0000 0000
 001cc10 0000 0000 0000 0000 0000 0000 0060 0000
 001cc20 0000 0000 0000 0000 0000 0000 0000 0000
 *
@@ -6887,7 +6887,7 @@
 001cd90 aea4 88bf a79a 988b b9b3 9288 b3b0 bda8
 001cda0 b984 b681 b292 9e90 bc82 908f a989 a49c
 001cdb0 b6a5 b283 b184 8d8a 9183 0000 0008 0000
-001cdc0 0000 0000 0cf8 b1cc 0000 0000 0000 0000
+001cdc0 0000 0000 0000 0000 0000 0000 0000 0000
 001cdd0 0000 0000 0018 0000 0000 0000 0000 0000
 001cde0 0000 0000 0000 0000 0000 0000 0000 0000
 *
@@ -6906,7 +6906,7 @@
 001cec0 0000 0000 0000 0000 0000 0000 0019 0000
 001ced0 0000 0000 4600 4043 3a3d 3437 2d30 272a
 001cee0 2124 1b1e 1518 0f12 090c 0306 0000 0000
-001cef0 0000 0000 0008 0000 0000 0000 2ef0 f6e1
+001cef0 0000 0000 0008 0000 0000 0000 0000 0000
 001cf00 0000 0000 0000 0000 0000 0000 0018 0000
 001cf10 0000 0000 0049 0000 0000 0000 bf96 a300
 001cf20 00bb b7a5 9200 00b2 b0b1 9700 00a9 a8a5
@@ -7595,7 +7595,7 @@
 001f9e0 7165 6703 6b68 6961 695b 985b 3875 3a61
 001f9f0 253c 2f47 357a 414a 6c61 6c79 a99b 7870
 001fa00 974a 6f71 44b4 7975 3674 7814 3e73 6942
-001fa10 0000 0000 0008 0000 0000 0000 2ef8 f6e1
+001fa10 0000 0000 0008 0000 0000 0000 0000 0000
 001fa20 0000 0000 0000 0000 0000 0000 00d7 0000
 001fa30 0000 0000 0000 0000 0000 0000 0000 0000
 *
@@ -7627,7 +7627,7 @@
 001fbf0 2f6b 5aad babf 2068 b020 6320 6a71 69a7
 001fc00 7566 9a67 946a 6803 337f 6568 7a4c 2020
 001fc10 8861 6a54 6120 2029 6f73 0000 0008 0000
-001fc20 0000 0000 2ef0 f6e1 0000 0000 0000 0000
+001fc20 0000 0000 0000 0000 0000 0000 0000 0000
 001fc30 0000 0000 003d 0000 0000 0000 00c8 0000
 001fc40 0000 0000 7a20 7500 7920 6400 6e61 6820
 001fc50 2075 0078 6e61 7820 6900 6a20 6569 7820
osfans commented 7 years ago

linux 64和arm 64的bin可以通用,兩個table.bin差異較大,其餘四個文件完全一樣。

lotem commented 7 years ago

@osfans 你是說在不同平臺下生成的 table.bin 不一致,但是可以通用嘛?

osfans commented 7 years ago

@lotem 是的 不会挂 但是不知是不是有些词序有问题.

ztl8702 commented 6 years ago

補充一個可能的使用場景,是我最近在實驗的一個東西: 嘗試用 Emscripten 將 Rime 編譯成 WebAssembly / asmjs。動機是可以用網頁版(免安裝)的方式讓用戶體驗不同輸入方案,以及可以將輸入法做成瀏覽器插件。

目前是可以粗糙地運行起來(Demo | Code), 不過在瀏覽器裏部署,一來很慢(超過1分鐘),二來占內存(>128MB),這樣可用性就比較低。因此最好還是要外部先生成 table.bin,然後再提供給 WebAssembly 上的 rime 使用。

目前這個Demo部署的文件是在瀏覽器的內存裏面 (Emscripten 的 Virtual File System) ,我看看有沒有辦法把它生成的 .bin 文件取出來和 x64 / x86 的 .bin 對比一下。

lotem commented 6 years ago

@ztl8702 Excited.

Prcuvu commented 6 years ago

做成瀏覽器插件

传说中的大白云终于要来了?

eagleoflqj commented 1 year ago

在OpenCC遇到了同样的问题https://github.com/BYVoid/OpenCC/issues/656#issuecomment-1356626786 应该是marisa写入了一些随机的垃圾内存