Filecoin - Precommit2計算介紹

買賣虛擬貨幣
Sector計算的部分分為Precommit1和Precommit2兩部分。兩部分合在一起,稱為SDR演算法。整個SDR演算法的相關計算在之前的文章介紹過:Filecoin - 為什麼SDR這麼慢?本文著重介紹一下Precommit2的計算邏輯。Precommit2計算分為兩部分:1/ Column Hash計算以及Merkle樹構造 2/ Replica計算以及Merkle樹的構造。相關的邏輯請檢視rust-fil-proofs/storage-proofs/porep/src/stacked/vanilla/proof.rs中的transform_and_replicate_layers函式。1. Column Hash計算Column Hash計算的實現在generate_tree_c函式。具體的實現分為兩個版本:CPU和GPU版本。if settings::SETTINGS.lock().unwrap().use_gpu_column_builder {       Self::generate_tree_c_gpu::<ColumnArity, TreeArity>(
           layers,           nodes_count,           tree_count,           configs,           labels,        )
} else {       Self::generate_tree_c_cpu::<ColumnArity, TreeArity>(           layers,           nodes_count,           tree_count,           configs,
           labels,       )}

GPU版本的邏輯相對複雜一些,講講GPU的邏輯:

進行column計算,需要從硬碟讀取11層layer的資料,並整合成column排布。GPU版本,一批批的進行處理,將一部分column讀取排序後,透過channel送給GPU處理(Column Hash以及構造Merkle樹)。程式碼邏輯大體上就是兩個執行緒,一個讀取layer的資料,column排序,另外一個GPU處理。每次batch的節點個數預設是400000,也就是135M左右。在column計算完成後,GPU構造Merkle樹。

2. Replica計算

Replica是最後一層layer的資料和原始資料編碼之後的結果。每次Encoding一部分Replica,透過channel送給GPU(構造Merkle樹)。每次batch的節點個數預設是700000,也就是22M左右。注意,batch的是Encoding的結果。

Merkle樹的構造都是採用merkletree庫。這個庫實現通用的Merkle樹的結構和計算。通用的Merkle樹,指的是Merkle並不只是通常我們理解的二叉樹,而是分成3層:top,sub和base。

如上圖的示例,top是1叉,sub是3叉,base是4叉。在Precommit2計算中,tree_c和tree_r_last都是8叉樹:

type Tree = storage_proofs::merkle::OctMerkleTree<DefaultTreeHasher>;
pub type OctMerkleTree<H> = DiskTree<H, U8, U0, U0>;

4. GPU加速

在Precommit2計算中,Column Hash的計算以及Merkle樹的構造是採用GPU加速。相關的程式碼在neptune程式碼庫中。有意思的是,這部分的程式碼並不是用cuda或者opencl實現的,而是一種新的更高層的語言:Futhark。

5. 相關巨集定義

FIL_PROOFS_USE_GPU_COLUMN_BUILDER - 使用GPU,進行column hash的計算
FIL_PROOFS_MAX_GPU_COLUMN_BATCH_SIZE - 每次計算Column的batch大小,預設400000
FIL_PROOFS_COLUMN_WRITE_BATCH_SIZE - 每次刷Column資料的batch大小,預設262144
FIL_PROOFS_USE_GPU_TREE_BUILDER - 使用GPU,構造Merkle樹
FIL_PROOFS_MAX_GPU_TREE_BATCH_SIZE - 每次Encoding計算的batch大小,預設700000

總結:

Precommit2階段,主要是計算Column Hash以及生成Replica,並構造相應的Merkle樹。其中,Column Hash的計算以及Merkle樹的構造可以採用GPU加速。GPU的實現採用一種新的高層語言:Futhark。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;