• 沒有找到結果。

在實驗前我們首先對工具做選擇,各式的 Library 以 The GNU Multiple Precision Arithmetic Library[15] 的 運 算 速 度 最 快 。 The GNU Multiple Precision Arithmetic Library 此 Library 為 目前世界上最快的大數運算 Library,而多執行緒的部分以 Linux 下的 POSIX 標準 pthread library。

3.1.1. The GNU Multiple Precision Arithmetic Library

在研究之前,便有用過各式的 Library : The GNU Multiple Precision Arithmetic Library、MIRCAL、BigInteger,The GNU Multiple Precision Arithmetic Library 與 MIRCAL 為 C 語言語法;BigInteger 為 JAVA 語法有

20

跨平台之特性,而在我們的研究中常用到的模運算與數論運算,其中以 The GNU Multiple Precision Arithmetic Library 的運算速度最快,MIRCAL 與 JAVA-BigInteger 分別為第二與第三。雖然 JAVA 有著跨平台的特性,但在 此我們不予考慮,最後還是以效能取向的 The GNU Multiple Precision Arithmetic Library 為主,在此簡稱為 GNU MP。GNU MP 此 Library 為目 前世界上最快的大數運算 Library,針對各式各樣的運算有不同的演算法做 到最佳化,在因數分解上常用到的模運算與數論運算皆有對應的方程式。

在此我們可運用 GNU MP 的資料結構做空間的最佳化。其中針對𝐺𝐹(2)的 𝐺𝐹(𝑛)模運算有不同的 Function 做最佳化,對模大數與模小數上有著不同 對應 Function。在大整數的宣告與運算上也有動態記憶體規劃,使資源不 浪費,針對在此研究中所用到的大數運算,GNU MP 可以幫助我們達到很 好的實驗結果。

GNU MP 有自己的大整數宣告與一般常用的 int 不同其宣告方式為 mpz_t,在 mpz_t 的宣告中若整數大小為一般 int 的大小便用一個 int 來存 取,若整數大小超過 int 便將其拆解為若干個 int 陣列做存取,其內部的各 方程式會針對所需要整數大小來做優化,在上章節中提出的各式演算法 中,最常用到的運算便是模運算,不單單只是模運算,還分為模大整數與 模小整數,對此所用到的 Function 便有所不同。除了模運算外還有一個重

21

要的除法運算,對不同大小與需求 GNU MP 總共有 27 種不同的除法 Function,當運算較重視除數、被除數、餘數與商或全部都考慮依精確度 的不同,可應對各種情形做到最佳化處理,下列為實際常用到的 Function。

表 3.1. GNU MP 常用之 Function

Function 數學式 變數型態 備註

mpz_mod(mpz_t r,mpz_t n,mpz_t d) 𝑟 = 𝑛 𝑑

pz_t 𝑟 pz_t 𝑛 pz_t 𝑑

大整數模運算

mpz_mod_ui(mpz_t r,mpz_t n,unsigned long int d) 𝑟 = 𝑛 𝑑

pz_t 𝑟 pz_t 𝑛 unsigne l ng int 𝑑

小整數模運算

mpz_fdiv_q_ui(mpz_t q,mpz_t n,unsigned long int d) 𝑛 𝑑 = ⌊𝑞⌋

pz_t 𝑞 pz_t 𝑛 unsigne l ng int 𝑑

小整數除法

(針對商的運算)

mpz_fdiv_qr(mpz_t q, mpz_t r,mpz_t n, mpz_t d) 𝑛 𝑑 = 𝑞 … 𝑟

pz_t 𝑞 pz_t 𝑟 pz_t 𝑛 pz_t 𝑑

大整數除法

(全部考慮)

mpz_xor(mpz_t rop, mpz_t op1, mpz_t op2) rop=op1^op2

pz_t 𝑟𝑜𝑝 pz_t 𝑜𝑝1 pz_t 𝑜𝑝2

大整數 exclusive-or

代表著原本長寬為128 × 128的二維矩陣,我們可以只用128個 GNU MP 整數便可以代表,同時也可以做兩整數的 exclusive or 運算並沒有需要 將資料重編譯的問題。在原本長寬為128 × 128的 int 矩陣中若要做兩個行 列式的 exclusive or 便要做128次,而 GNU MP 中所使用的 exclusive or 便

22

是以 32 位元的整數做切割,可減少我們 exclusive or 的次數在例子 128 中 便只要做 4 次的 exclusive or,可減少我們的運算時間。

[32 bit ⋯ 32 bit

32 bit ⋯ 32 bit ]

以 int 來宣告一個矩陣,若資料只有 0-1 之時便很浪費空間

[

GMP 標頭 1 bit ⋯ 1 bit

⋮ ⋱

GMP 標頭 1 bit ⋯ 1 bit ]

如此便將 0-1 的資料編為多個 GMP 整數

而 GNU MP 可將資料存為任意大小的整數,故在矩陣多大的情況下都 可做編製並節省 I/O 的時間。這樣的情況之下的限制只存在硬體規格的問 題。在 GNU MP 的支援條件下我們可以將 Gaussian Elimination 改寫降低程 式的運算時間。

3.1.2. POSIX Pthread

在我們目前的電腦規格,大部份為多核心之 CPU,但我們在寫程式執 行時只用到一個核心,這在程式規劃上較為簡易,但 CPU 的實際效能未被 有效的利用到,這時若可將工作程序做切割或演算法上做切割,便可將原 本程式的執行時間降低,這是我們所期待的最佳情況。

在研究之前,便有用過各式的 Library : Pthread、Win32、JAVA,考慮 到我們的系統以 Linux 為主 Win32 便不在考慮範圍之中,而 JAVA 雖有跨

23

平台之特性,但我們大數運算 Library 已決定為 GNU MP 為了在整合上的 便利所以也選擇以 C 語言為架構的 Pthread。Linux 下最常用的是遵循 POSIX 標準的 pthread library,在這裡會用到此函式庫來幫助我們做工作的 切割使多核心電腦的效能達到一定的使用量。在我們的研究中演算法的切 割並不容易所以退而求其次將工作分派給各 Thread 程式中。也就是 sieve 的部份做區段分割。在研究中會針對排班的部份做設計與 Thread 程式做結 合。在 thread 程式中所執行的 Function 只能攜帶一個 point,所以便要先將 我們所需的資料定成一個資料結構來讓 Function 攜帶,同時也要一個資料 結構讓 Function 回傳程式的執行結果。

表 3.2. Pthread 常用之 Function

Function 變數 性質

pthread_t thread[i] Thread[i] 產生執行緒序號

pthread_create(&thread[i],

NULL,matrix_sieve,thread_info)

&thread[i]:thread 序號

matrix_sieve:Function 名稱

thread_info:將 Function 所需的變數做成 point

建立多執行緒

pthread_join(thread[i],(void**)&file);

thread[i]:thread 序號

(void**)&file:thread 回傳的 point

結束多執行緒

相關文件