㈠ 關於圓周率的歷史資料
古希臘作為古代幾何王國對圓周率的貢獻尤為突出。古希臘大數學家阿基米德(公元前287–212 年) 開創了人類歷史上通過理論計算圓周率近似值的先河。阿基米德從單位圓出發,先用內接正六邊形求出圓周率的下界為3,再用外接正六邊形並藉助勾股定理求出圓周率的上界小於4。
接著,他對內接正六邊形和外接正六邊形的邊數分別加倍,將它們分別變成內接正12邊形和外接正12邊形,再藉助勾股定理改進圓周率的下界和上界。他逐步對內接正多邊形和外接正多邊形的邊數加倍,直到內接正96邊形和外接正96邊形為止。
最後,他求出圓周率的下界和上界分別為223/71 和22/7, 並取它們的平均值3.141851 為圓周率的近似值。阿基米德用到了迭代演算法和兩側數值逼近的概念,稱得上是「計算數學」的鼻祖。
南北朝時代著名數學家祖沖之進一步得出精確到小數點後7位的π值(約5世紀下半葉),給出不足近似值3.1415926和過剩近似值3.1415927,還得到兩個近似分數值,密率355/113和約率22/7。他的輝煌成就比歐洲至少早了1000年。
其中的密率在西方直到1573才由德國人奧托得到,1625年發表於荷蘭工程師安托尼斯的著作中,歐洲不知道是祖沖之先知道密率的,將密率錯誤的稱之為安托尼斯率。
阿拉伯數學家卡西在15世紀初求得圓周率17位精確小數值,打破祖沖之保持近千年的紀錄。
德國數學家柯倫於1596年將π值算到20位小數值,後投入畢生精力,於1610年算到小數後35位數,該數值被用他的名字稱為魯道夫數。
斐波那契算出圓周率約為3.1418。
韋達用阿基米德的方法,算出3.1415926535<π<3.1415926537
他還是第一個以無限乘積敘述圓周率的人。
魯道夫萬科倫以邊數多過32000000000的多邊形算出有35個小數位的圓周率。
華理斯在1655年求出一道公式π/2=2×2×4×4×6×6×8×8...../3×3×5×5×7×7×9×9......
歐拉發現的e的iπ次方加1等於0,成為證明π是超越數的重要依據。
(1)一億個隨機數用什麼演算法排序擴展閱讀:
魏晉時,劉徽曾用使正多邊形的邊數逐漸增加去逼近圓周的方法(即「割圓術」),求得π的近似值3.1416。
漢朝時,張衡得出π的平方除以16等於5/8,即π等於10的開方(約為3.162)。雖然這個值不太准確,但它簡單易理解,所以也在亞洲風行了一陣。 王蕃(229-267)發現了另一個圓周率值,這就是3.156,但沒有人知道他是如何求出來的。
公元5世紀,祖沖之和他的兒子以正24576邊形,求出圓周率約為355/113,和真正的值相比,誤差小於八億分之一。這個紀錄在一千年後才給打破。
印度,約在公元530年,數學大師阿耶波多利用384邊形的周長,算出圓周率約為√9.8684。 婆羅門笈多採用另一套方法,推論出圓周率等於10的算術平方根。
圓周率(Pai)是圓的周長與直徑的比值,一般用希臘字母π表示,是一個在數學及物理學中普遍存在的數學常數。π也等於圓形之面積與半徑平方之比。是精確計算圓周長、圓面積、球體積等幾何形狀的關鍵值。 在分析學里,π可以嚴格地定義為滿足sin x = 0的最小正實數x。
圓周率用字母 π(讀作pài)表示,是一個常數(約等於3.141592654),是代表圓周長和直徑的比值。它是一個無理數,即無限不循環小數。
在日常生活中,通常都用3.14代表圓周率去進行近似計算。而用十位小數3.141592654便足以應付一般計算。即使是工程師或物理學家要進行較精密的計算,充其量也只需取值至小數點後幾百個位。
㈡ 小學學了的知識忘了:什麼是素數
質數(又稱為素數)
1.就是在所有比1大的整數中,除了1和它本身以外,不再有別的因數,這種整數叫做質數。還可以說成質數只有1和它本身兩個約數。2.素數是這樣的整數,它除了能表示為它自己和1的乘積以外,不能表示為任 何其它兩個整數的乘積。例如,15=3*5,所以15不是素數;
又如,12 =6*2=4*3,所以12也不是素數。另一方面,13除了等於13*1以 外,不能表示為其它任何兩個整數的乘積,所以13是一個素數。
[編輯本段]質數的概念
一個數,如果只有1和它本身兩個因數,這樣的數叫做質數(或素數)。例如 2,3,5,7 是質數,而 4,6,8,9 則不是,後者稱為合成數或合數。從這個觀點可將整數分為兩種,一種叫質數,一種叫合成數。(1不是質數,也不是合數)著名的高斯「唯一分解定理」說,任何一個整數。可以寫成一串質數相乘的積。質數中除2是偶數外,其他都是奇數。
[編輯本段]質數的奧秘
質數的分布是沒有規律的,往往讓人莫名其妙。如:101、401、601、701都是質數,但上下面的301(7*43)和901(17*53)卻是合數。
有人做過這樣的驗算:1^2+1+41=43,2^2+2+41=47,3^2+3+41=53……於是就可以有這樣一個公式:設一正數為n,則n^2+n+41的值一定是一個質數。這個式子一直到n=39時,都是成立的。但n=40時,其式子就不成立了,因為40^2+40+41=1681=41*41。
說起質數就少不了哥德巴赫猜想,和著名的「1+1」
哥德巴赫猜想 :(Goldbach Conjecture)
內容為「所有的不小於6的偶數,都可以表示為兩個素數」
這個問題是德國數學家哥德巴赫(C.Goldbach,1690-1764)於1742年6月7日在給大數學家歐拉的信中提出的,所以被稱作哥德巴赫猜想。同年6月30日,歐拉在回信中認為這個猜想可能是真的,但他無法證明。從此,這道數學難題引起了幾乎所有數學家的注意。哥德巴赫猜想由此成為數學皇冠上一顆可望不可及的「明珠」。「用當代語言來敘述,哥德巴赫猜想有兩個內容,第一部分叫做奇數的猜想,第二部分叫做偶數的猜想。奇數的猜想指出,任何一個大於等於7的奇數都是三個素數的和。偶數的猜想是說,大於等於4的偶數一定是兩個素數的和。」(引自《哥德巴赫猜想與潘承洞》)
哥德巴赫猜想貌似簡單,要證明它卻著實不易,成為數學中一個著名的難題。18、19世紀,所有的數論專家對這個猜想的證明都沒有作出實質性的推進,直到20世紀才有所突破。直接證明哥德巴赫猜想不行,人們採取了「迂迴戰術」,就是先考慮把偶數表為兩數之和,而每一個數又是若干素數之積。如果把命題"每一個大偶數可以表示成為一個素因子個數不超過a個的數與另一個素因子不超過b個的數之和"記作"a+b",那麼哥氏猜想就是要證明"1+1"成立。
1900年,20世紀最偉大的數學家希爾伯特,在國際數學會議上把「哥德巴赫猜想」列為23個數學難題之一。此後,20世紀的數學家們在世界范圍內「聯手」進攻「哥德巴赫猜想」堡壘,終於取得了輝煌的成果。
到了20世紀20年代,有人開始向它靠近。1920年,挪威數學家布爵用一種古老的篩選法證明,得出了一個結論:每一個比6大的偶數都可以表示為(9+9)。這種縮小包圍圈的辦法很管用,科學家們於是從(9十9)開始,逐步減少每個數里所含質數因子的個數,直到最後使每個數里都是一個質數為止,這樣就證明了「哥德巴赫猜想」。
1920年,挪威的布朗(Brun)證明了 「9+9 」。
1924年,德國的拉特馬赫(Rademacher)證明了「7+7 」。
1932年,英國的埃斯特曼(Estermann)證明了 「6+6 」。
1937年,義大利的蕾西(Ricei)先後證明了「5+7 」, 「4+9 」, 「3+15 」和「2+366 」。
1938年,蘇聯的布赫 夕太勃(Byxwrao)證明了「5+5 」。
1940年,蘇聯的布赫 夕太勃(Byxwrao)證明了 「4+4 」。
1948年,匈牙利的瑞尼(Renyi)證明了「1+c 」,其中c是一很大的自然數。
1956年,中國的王元證明了 「3+4 」。
1957年,中國的王元先後證明了 「3+3 」和 「2+3 」。
1962年,中國的潘承洞和蘇聯的巴爾巴恩(BapoaH)證明了 「1+5 」, 中國的王元證明了「1+4 」。
1965年,蘇聯的布赫 夕太勃(Byxwrao)和小維諾格拉多夫(BHHopappB),及 義大利的朋比利(Bombieri)證明了「1+3 」。
1966年,中國的陳景潤證明了 「1+2 」[用通俗的話說,就是大偶數=素數+素數*素數或大偶數=素數+素數(註:組成大偶數的素數不可能是偶素數,只能是奇素數。因為在素數中只有一個偶素數,那就是2。)]。
其中「s + t 」問題是指: s個質數的乘積 與t個質數的乘積之和
20世紀的數學家們研究哥德巴赫猜想所採用的主要方法,是篩法、圓法、密率法和三角和法等等高深的數學方法。解決這個猜想的思路,就像「縮小包圍圈」一樣,逐步逼近最後的結果。
由於陳景潤的貢獻,人類距離哥德巴赫猜想的最後結果「1+1」僅有一步之遙了。但為了實現這最後的一步,也許還要歷經一個漫長的探索過程。有許多數學家認為,要想證明「1+1」,必須通過創造新的數學方法,以往的路很可能都是走不通的。實際上:
一陳景潤證明的不是哥德巴赫猜想
陳景潤與邵品宗合著的【哥德巴赫猜想】第118頁(遼寧教育出版社)寫道:陳景潤定理的「1+1」結果,通俗地講是指:對於任何一個大偶數N,那麼總可以找到奇素數P',P",或者P1,P2,P3,使得下列兩式至少一式成立:「
N=P'+P" (A)
N=P1+P2*P3 (B)
當然並不排除(A)(B)同時成立的情形,例如62=43+19,62=7+5X11。」
眾所周知,哥德巴赫猜想是指對於大於4的偶數(A)式成立,【1+2】是指對於大於10的偶數(B)式成立,
兩者是不同的兩個命題,陳景潤把兩個毫不相關的命題混為一談,並在申報獎項時偷換了概念(命題),陳景潤也沒有證明【1+2】,因為【1+2】比【1+1】難得多。
二。 陳景潤使用了錯誤的推理形式
陳採用的是相容選言推理的「肯定肯定式」:或者A,或者B,A,所以或者A或B,或A與B同時成立。 這是一種錯誤的推理形式,模稜兩可,牽強附會,言之無物,什麼也沒有肯定,正如算命先生那樣「:李大嫂分娩,或者生男孩,或者生女孩,或者同時生男又生女(多胎)」。無論如何都是對的,這種判斷在認識論上稱為不可證偽,而可證偽性是科學與偽科學的分界。相容選言推理只有一種正確形式。否定肯定式:或者A,或者B,非A,所以B。相容選言推理有兩條規則:1,否認一部分選言肢,就必須肯定另一部分選言肢;2,肯定一部分選言肢卻不能否定另一部份選言肢。可見對陳景潤的認可表明中國數學會思維混亂,缺乏基本的邏輯訓練。
三。 陳景潤大量使用錯誤概念
陳在論文中大量使用「充分大」和「殆素數」這兩個含糊不清的概念。而科學概念的特徵就是:精確性,專義性,穩定性,系統性,可檢驗性。「殆素數」指很像素數,拿像與不像來論證,這是小孩的游戲。而「充分大」,陳指10的50萬次方,這是不可檢驗的數。
四。陳景潤的結論不能算定理
陳的結論採用的是特稱(某些,一些),即某些N是(A),某些N是(B),就不能算定理,因為所有嚴格的科學的定理,定律都是以全稱(所有,一切,全部,每個)命題形式表現出來,一個全稱命題陳述一個給定類的所有元素之間的一種不變關系,適用於一種無窮大的類,它在任何時候都無區別的成立。而陳景潤的結論,連概念都算不上。
五。陳景潤的工作嚴重違背認識規律
在沒有找到素數普篇公式之前,哥氏猜想是無法解決的,正如化圓為方取決於圓周率的超越性是否搞清,事物質的規定性決定量的規定性。(王曉明1999年《中華傳奇》第三期「哥德巴赫猜想傳奇)
英文的
prime number: a number that haas exact 2 foctor
[編輯本段]質數的性質
被稱為「17世紀最偉大的法國數學家」費爾馬,也研究過質數的性質。他發現,設Fn=2^(2^n)+1,則當n分別等於0、1、2、3、4時,Fn分別給出3、5、17、257、65537,都是質數,由於F5太大(F5=4294967297),他沒有再往下檢測就直接猜測:對於一切自然數,Fn都是質數。但是,就是在F5上出了問題!費爾馬死後67年,25歲的瑞士數學家歐拉證明:F5=4294967297=641*6700417,並非質數,而是合數。
更加有趣的是,以後的Fn值,數學家再也沒有找到哪個Fn值是質數,全部都是合數。目前由於平方開得較大,因而能夠證明的也很少。現在數學家們取得Fn的最大值為:n=1495。這可是個超級天文數字,其位數多達10^10584位,當然它盡管非常之大,但也不是個質數。質數和費爾馬開了個大玩笑!
還有一種被稱為「殆素數」的,意思是很像素數,著名數學家陳景潤就使用了這個概念,他的「1+2」的「2」,就表示「殆素數」,實際上是一個合數。大家不要搞混了。嚴格地講,「殆素數」不是一個科學概念,因為科學概念的特徵是(1)精確性;(2)穩定性;(3)可以檢驗;(4)系統性;(5)專義性。例如,許多數學家使用了「充分大」,這也是一個模糊概念,因為陳景潤把它定義為「10的50萬次方」,即在10的後面加上50萬個「0」。這是一個無法檢驗的數。
[編輯本段]質數的假設
17世紀還有位法國數學家叫梅森,他曾經做過一個猜想:2^p-1代數式,當p是質數時,2^p-1是質數。他驗算出了:當p=2、3、5、7、17、19時,所得代數式的值都是質數,後來,歐拉證明p=31時,2^p-1是質數。 p=2,3,5,7時,Mp都是素數,但M11=2047=23×89不是素數。
還剩下p=67、127、257三個梅森數,由於太大,長期沒有人去驗證。梅森去世250年後,美國數學家科勒證明,2^67-1=193707721*761838257287,是一個合數。這是第九個梅森數。20世紀,人們先後證明:第10個梅森數是質數,第11個梅森數是合數。質數排列得這樣雜亂無章,也給人們尋找質數規律造成了困難。
[編輯本段]質數表上的質數
現在,數學家找到的最大的梅森數是一個有9808357位的數:2^32582657-1。數學雖然可以找到很大的質數,但質數的規律還是無法循通。
30000以內的質數表
[編輯本段]【求大質數的方法】
研究發現質數除2以外都是奇數,而奇數除了【奇數*奇數】(或再加「*奇數」)都是質數。那麼用計算機先把【奇數*奇數】(或再加「*奇數」)(比如9,15,21,25,27,33,35,39……)都求出來,再找奇數中上面沒提到的那些數,那些數就是素數。
人們找出的幾個超大質數中有遺漏,那麼就可以用此方法求出那些遺漏的數,不過需要很長時間!
這對於「孿生素數」有幫助喔!
上面這個演算法比較垃圾,對於求很大的素數效率低下,這個很大的素數可以用概率演算法求。
求素數,請用《公理與素數計算》。這種方法用不著將所有奇數都寫出來,而且計算出來的素數可以做到一個不漏。對於合數的刪除,也不是涉及所有奇合數,刪除是准確無誤的,刪除奇合數後剩餘的全部是素數。如:對奇素數3的倍數的數進行刪除,在整個自然數中只須刪除一個數;對素數5的倍數的數進行刪除,在整個自然數中只須刪除2個數;對素數7的倍數的數進行刪除,在整個自然數中只須刪除8個數;以此類推,如果哪位老師能夠將它用電腦編成程序,對計算素數有很大的幫助。
[編輯本段]【質數的個數】
有近似公式: x 以內質數個數約等於 x / ln(x)
ln是自然對數的意思。
尚准確的質數公式未給出。
10 以內共 4 個質數。
100 以內共 25 個質數。
1000 以內共 168 個質數。
10000 以內共 1229 個質數。
100000 以內共 9592 個質數。
1000000 以內共 78498 個質數。
10000000 以內共 664579 個質數。
100000000 以內共 5761455 個質數。
......
[編輯本段]【求質數的方法】
古老的篩法可快速求出100000000以內的所有素數。
篩法,是求不超過自然數N(N>1)的所有質數的一種方法。據說是古希臘的埃拉托斯特尼(Eratosthenes,約公元前274~194年)發明的,又稱埃拉托斯特尼篩子。
具體做法是:先把N個自然數按次序排列起來。1不是質數,也不是合數,要劃去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第一個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第一個沒劃去的數是5,把5留下,再把5後面所有能被5整除的數都劃去。這樣一直做下去,就會把不超過N的全部合數都篩掉,留下的就是不超過N的全部質數。因為希臘人是把數寫在塗臘的板上,每要劃去一個數,就在上面記以小點,尋求質數的工作完畢後,這許多小點就像一個篩子,所以就把埃拉托斯特尼的方法叫做「埃拉托斯特尼篩」,簡稱「篩法」。(另一種解釋是當時的數寫在紙草上,每要劃去一個數,就把這個數挖去,尋求質數的工作完畢後,這許多小洞就像一個篩子。)
}
本機測試結果:10000000用時1156ms(1.156秒)
100000000用時80秒(較慢,主要是內存太少,反復讀硬碟的原因)
[編輯本段]【判定質數的方法】
1 樸素篩法,就是直接試除
2 若a是n的因子,那麼n/a也是n的因子,所以如果n有一個大於1的真因子,則必有一個不大於n的1/2次方的因子
3 進一步的,如n是合數,他必有一個素因子不大於n的1/2次方,如要檢測一個m以內的數是否為素數需事先建立一個m的1/2次方以內素數表。
4 Miller-Rabbin演算法
5 概率演算法
6 無條件的素數測試(包含APR演算法 Jacobi sum測試 等)
7.n的n次冪除以n,若余數為2,則n為質數
......
效率比較:
效率比較一般的有 Eraosthenes氏篩選法
效率較高的有
Jacobbi Sums測試
更好的有
Miller-Rabbin演算法(Monte-Carlo系列的演算法)
不過這個是概率演算法,依賴於 ERH(extend Riemann Hypothesis)
現在使用的素數判定演算法還有
Unconditional Primality Test(基於Algebraic Number Theory)
近15年來還有橢圓曲線演算法,
APR, Random Curve, Abelian Variety測試
[編輯本段]【素數的生成】
根據素數定理,素數平均分布稠密程度π(x)/x≈1/lnx,對於512位大整數,隨機產生為素數概率約為1/355,繼而我們對每個隨機數利用Miller-Rabbin測試,不斷選取基b,計算是否每次都有bn-1 mod n=1都成立,則n幾乎肯定是素數。由於多次運行後出錯概率非常小,在實際中是可以信賴的。在Java里,BigInteger類提供的isProbablePrime()函數幫助簡化了測試操作。
代碼僅供參考,屬於概率型,不保證求出的都是質數。
素數是這樣的整數,它除了能表示為它自己和1的乘積以外,不能表示為任何其它兩個整數的乘積。例如,15=3×5,所以15不是素數;又如,12=6×2=4×3,所以12也不是素數。另一方面,13除了等於13×1以外,不能表示為其它任何兩個整數的乘積,所以13是一個素數。
有的數,如果單憑印象去捉摸,是無法確定它到底是不是素數的。有些數則可以馬上說出它不是素數。一個數,不管它有多大,只要它的個位數是2、4、5、6、8或0,就不可能是素數。此外,一個數的各位數字之和要是可以被3整除的話,它也不可能是素數。但如果它的個位數是1、3、7或9,而且它的各位數字之和不能被3整除,那麼,它就可能是素數(但也可能不是素數)。沒有任何現成的公式可以告訴你一個數到底是不是素數。你只能試試看能不能將這個數表示為兩個比它小的數的乘積。
找素數的一種方法是從2開始用「是則留下,不是則去掉」的方法把所有的數列出來(一直列到你不想再往下列為止,比方說,一直列到10,000)。
第一個數是2,它是一個素數,所以應當把它留下來,然後繼續往下數,每隔一個數刪去一個數,這樣就能把所有能被2整除、因而不是素數的數都去掉。在留
下的最小的數當中,排在2後面的是3,這是第二個素數,因此應該把它留下,然後從它開始往後數,每隔兩個數刪去一個,這樣就能把所有能被3整除的數全
都去掉。下一個未去掉的數是5,然後往後每隔4個數刪去一個,以除去所有能被5整除的數。再下一個數是7,往後每隔6個數刪去一個;再下一個數是11
,往後每隔10個數刪一個;再下一個是13,往後每隔12個數刪一個。……就這樣依法做下去。
你也許會認為,照這樣刪下去,隨著刪去的數越來越多,最後將會出現這樣的情況;某一個數後面的數會統統被刪去崮此在某一個最大的素數後面,再也不
會有素數了。但是實際上,這樣的情況是不會出現的。不管你取的數是多大,百萬也好,萬萬也好,總還會有沒有被刪去的、比它大的素數。
事實上,早在公元前300年,希臘數學家歐幾里得就已證明過,不論你取的數是多大,肯定還會有比它大的素數,假設你取出前6個素數,並把它們乘在
一起:2×3×5×7×11×13=30030,然後再加上1,得30031。這個數不能被2、3、5、7、11、13整除,因為除的結果,每次都會餘1。如果30031除了自己以外不能被任何數整除,它就是素數。如果能被其它數整除,那麼30031所分解成的幾個數,一定都大於13。事實上,3
0031=59×509。
對於前一百個、前一億個或前任意多個素數,都可以這樣做。如果算出了它們的乘積後再加上1,那麼,所得的數或者是一個素數,或者是比所列出的素數還要大的幾個素數的乘積。不論所取的數有多大,總有比它大的素數,因此,素數的數目是無限的。
隨著數的增大,我們會一次又一次地遇到兩個都是素數的相鄰奇數對,如5,7;11,13;17,19;29,31;41,43;等等。就數學家所能及的數來說,它們總是能找到這樣的素數對。這樣的素數對到底是不是有無限
個呢?誰也不知道。數學家認為是無限的,但他們從來沒能證明它。這就是數學家為什麼對素數感興趣的原因。素數為數學家提供了一些看起來很容易、但事實
卻非常難以解決的問題,他們目前還沒能對付
㈢ 什麼是CUDA
官方網站http://www.nvidia.cn/ object/cuda_get_cn_old.html
網路上有
CUDA(Compute Unified Device Architecture),顯卡廠商NVIDIA推出的運算平台。 CUDA™是一種由NVIDIA推出的通用並行計算架構,該架構使GPU能夠解決復雜的計算問題。 它包含了CUDA指令集架構(ISA)以及GPU內部的並行計算引擎。 開發人員現在可以使用C語言來為CUDA™架構編寫程序,C語言是應用最廣泛的一種高級編程語言。所編寫出的程序於是就可以在支持CUDA™的處理器上以超高性能運行。 將來還會支持其它語言,包括FORTRAN以及C++。
目錄
簡介
發展歷程
工具包
發展現況
背景
編輯本段簡介
計算行業正在從只使用CPU的「中央處理」向CPU與GPU並用的「協同處理」發展。為打造這一全新的計算典範,NVIDIA®(英偉達™)發明了CUDA(Compute Unified Device Architecture,統一計算設備架構)這一編程模型,是想在應用程序中充分利用CPU和GPU各自的優點。現在,該架構現已應用於GeForce®(精視™)、ION™(翼揚™)、Quadro以及Tesla GPU(圖形處理器)上,對應用程序開發人員來說,這是一個巨大的市場。
在消費級市場上,幾乎每一款重要的消費級視頻應用程序都已經使用CUDA加速或很快將會利用CUDA來加速,其中不乏Elemental Technologies公司、MotionDSP公司以及LoiLo公司的產品。
在科研界,CUDA一直受到熱捧。例如,CUDA現已能夠對AMBER進行加速。AMBER是一款分子動力學模擬程序,全世界在學術界與制葯企業中有超過60,000名研究人員使用該程序來加速新葯的探索工作。
在金融市場,Numerix以及CompatibL針對一款全新的對手風險應用程序發布了CUDA支持並取得了18倍速度提升。Numerix為近400家金融機構所廣泛使用。
CUDA的廣泛應用造就了GPU計算專用Tesla GPU的崛起。全球財富五百強企業現在已經安裝了700多個GPU集群,這些企業涉及各個領域,例如能源領域的斯倫貝謝與雪佛龍以及銀行業的法國巴黎銀行。
隨著微軟Windows 7與蘋果Snow Leopard操作系統的問世,GPU計算必將成為主流。在這些全新的操作系統中,GPU將不僅僅是圖形處理器,它還將成為所有應用程序均可使用的通用並行處理器。
編輯本段發展歷程
隨著顯卡的發展,GPU越來越強大,而且GPU為顯示圖像做了優化。在計算上已經超越了通用的CPU。如此強大的晶元如果只是作為顯卡就太浪費了,因此NVidia推出CUDA,讓顯卡可以用於圖像計算以外的目的。
目前只有G80、G92、G94、G96、GT200、GF100、GF110、GK100平台(即Geforce 8~Gecorce GTX690)的NVidia顯卡才能使用CUDA,工具集的核心是一個C語言編譯器。G80中擁有128個單獨的ALU,因此非常適合並行計算,而且數值計算的速度遠遠優於CPU。
CUDA的SDK中的編譯器和開發平台支持Windows、linux系統,可以與Visual Studio2005,2008,2010集成在一起。
Geforce8CUDA(Compute Unified Device Architecture)是一個新的基礎架構,這個架構可以使用GPU來解決商業、工業以及科學方面的復雜計算問題。它是一個完整的GPGPU解決方案,提供了硬體的直接訪問介面,而不必像傳統方式一樣必須依賴圖形API介面來實現GPU的訪問。在架構上採用了一種全新的計算體系結構來使用GPU提供的硬體資源,從而給大規模的數據計算應用提供了一種比CPU更加強大的計算能力。CUDA採用C語言作為編程語言提供大量的高性能計算指令開發能力,使開發者能夠在GPU的強大計算能力的基礎上建立起一種效率更高的密集數據計算解決方案。
從CUDA體系結構的組成來說,包含了三個部分:開發庫、運行期環境和驅動(表2)。
開發庫是基於CUDA技術所提供的應用開發庫。目前CUDA的1.1版提供了兩個標準的數學運算庫——CUFFT(離散快速傅立葉變換)和CUBLAS(離散基本線性計算)的實現。這兩個數學運算庫所解決的是典型的大規模的並行計算問題,也是在密集數據計算中非常常見的計算類型。開發人員在開發庫的基礎上可以快速、方便的建立起自己的計算應用。此外,開發人員也可以在CUDA的技術基礎上實現出更多的開發庫。
運行期環境提供了應用開發介面和運行期組件,包括基本數據類型的定義和各類計算、類型轉換、內存管理、設備訪問和執行調度等函數。基於CUDA開發的程序代碼在實際執行中分為兩種,一種是運行在CPU上的宿主代碼(Host Code),一種是運行在GPU上的設備代碼(Device Code)。不同類型的代碼由於其運行的物理位置不同,能夠訪問到的資源不同,因此對應的運行期組件也分為公共組件、宿主組件和設備組件三個部分,基本上囊括了所有在GPGPU開發中所需要的功能和能夠使用到的資源介面,開發人員可以通過運行期環境的編程介面實現各種類型的計算。
由於目前存在著多種GPU版本的NVidia顯卡,不同版本的GPU之間都有不同的差異,因此驅動部分基本上可以理解為是CUDA-enable的GPU的設備抽象層,提供硬體設備的抽象訪問介面。CUDA提供運行期環境也是通過這一層來實現各種功能的。目前基於CUDA開發的應用必須有NVIDIA CUDA-enable的硬體支持,NVidia公司GPU運算事業部總經理Andy Keane在一次活動中表示:一個充滿生命力的技術平台應該是開放的,CUDA未來也會向這個方向發展。由於CUDA的體系結構中有硬體抽象層的存在,因此今後也有可能發展成為一個通用的GPGPU標准介面,兼容不同廠商的GPU產品
編輯本段工具包
是一種針對支持CUDA功能的GPU(圖形處理器)的C語言開發環境。CUDA開發環境包括:
· nvcc C語言編譯器
· 適用於GPU(圖形處理器)的CUDA FFT和BLAS庫。[1]
· 分析器
· 適用於GPU(圖形處理器)的gdb調試器(在2008年3月推出alpha版)
· CUDA運行時(CUDA runtime)驅動程序(目前在標準的NVIDIA GPU驅動中也提供)。[1]
CUDA編程手冊
CUDA開發者軟體開發包(SDK)提供了一些範例(附有源代碼),以幫助使用者開始CUDA編程。這些範例包括:
· 並行雙調排序
· 矩陣乘法
· 矩陣轉置
· 利用計時器進行性能評價
· 並行大數組的前綴和(掃描)
· 圖像卷積
· 使用Haar小波的一維DWT
· OpenGL和Direct3D圖形互操作示例
· CUDA BLAS和FFT庫的使用示例
· CPU-GPU C—和C++—代碼集成
· 二項式期權定價模型
· Black-Scholes期權定價模型
· Monte-Carlo期權定價模型
· 並行Mersenne Twister(隨機數生成)
· 並行直方圖
· 圖像去噪
· Sobel邊緣檢測濾波器
· MathWorks MATLAB®
新的基於1.1版CUDA的SDK 範例現在也已經發布了。[1]
技術功能
· 在GPU(圖形處理器)上提供標准C編程語言
· 為在支持CUDA的NVIDIA GPU(圖形處理器)上進行並行計算而提供了統一的軟硬體解決方案
· CUDA兼容的GPU(圖形處理器)包括很多:從低功耗的筆記本上用的GPU到高性能的,多GPU的系統。
· 支持CUDA的GPU(圖形處理器)支持並行數據緩存和線程執行管理器
· 標准FFT(快速傅立葉變換)和BLAS(基本線性代數子程序)數值程序庫
· 針對計算的專用CUDA驅動
· 經過優化的,從中央處理器(CPU)到支持CUDA的GPU(圖形處理器)的直接上傳、下載通道
· CUDA驅動可與OpenGL和DirectX圖形驅動程序實現互操作
· 支持Linux 32位/64位以及Windows XP 32位/64位 操作系統
· 為了研究以及開發語言的目的,CUDA提供對驅動程序的直接訪問,以及匯編語言級的訪問。[1]
編輯本段發展現況
支持CUDA的GPU銷量已逾1億,數以千計的軟體開發人員正在使用免費的CUDA軟體開發工具來解決各種專業以及家用應用程序中的問題。這些應用程序從視頻與音頻處理和物理效果模擬到石油天然氣勘探、產品設計、醫學成像以及科學研究,涵蓋了各個領域。 目前市面上已經部署了超過一億顆支持CUDA的GPU,數以千計的軟體開發人員正在使用免費的CUDA軟體工具來為各種應用程序加速。
CUDA 的核心有三個重要抽象概念: 線程組層次結構、共享存儲器、屏蔽同步( barrier
synchronization),可輕松將其作為C 語言的最小擴展級公開給程序員。
CUDA 軟體堆棧由幾層組成,一個硬體驅動程序,一個應用程序編程介面(API)
和它的Runtime, 還有二個高級的通用數學庫,CUFFT 和CUBLAS。硬體被設計成支持輕
量級的驅動和Runtime 層面,因而提高性能。
所支持的OS(operating system)
CUDA目前支持linux和Windows操作系統。進行CUDA開發需要依次安裝驅動、toolkit、SDK三個軟體。在安裝目錄/C/src目錄下有很多的常式可以進行學習。
NVIDIA進軍高性能計算領域,推出了Tesla&CUDA高性能計算系列解決方案,CUDA技術,一種基於NVIDIA圖形處理器(GPU)上全新的並行計算體系架構,讓科學家、工程師和其他專業技術人員能夠解決以前無法解決的問題,作為一個專用高性能GPU計算解決方案,NVIDIA把超級計算能夠帶給任何工作站或伺服器,以及標准、基於CPU的伺服器集群
CUDA是用於GPU計算的開發環境,它是一個全新的軟硬體架構,可以將GPU視為一個並行數據計算的設備,對所進行的計算進行分配和管理。在CUDA的架構中,這些計算不再像過去所謂的GPGPU架構那樣必須將計算映射到圖形API(OpenGL和Direct 3D)中,因此對於開發者來說,CUDA的開發門檻大大降低了。CUDA的GPU編程語言基於標準的C語言,因此任何有C語言基礎的用戶都很容易地開發CUDA的應用程序。
由於GPU的特點是處理密集型數據和並行數據計算,因此CUDA非常適合需要大規模並行計算的領域。目前CUDA除了可以用C語言開發,也已經提供FORTRAN的應用介面,未來可以預計CUDA會支持C++、Java、Python等各類語言。可廣泛的應用在圖形動畫、科學計算、地質、生物、物理模擬等領域。
2008年NVIDIA推出CUDA SDK2.0版本,大幅提升了CUDA的使用范圍。使得CUDA技術愈發成熟
編輯本段背景
計算正在從CPU"中央處理"向CPU與GPU"協同處理"的方向發展。 為了實現這一新型計算模式,英偉達發明了英偉達™ CUDA™ 並行計算架構。該架構現在正運用於英偉達™ (NVIDIA) Tesla™、英偉達™ Quadro (NVIDIA Quadro) 以及英偉達™ 精視™ (NVIDIA GeForce) GPU上。對應用程序開發商來說,英偉達™ CUDA™ 架構擁有龐大的用戶群。
在科學研究領域,英偉達™ CUDA™ 受到狂熱追捧。 例如,英偉達™ CUDA™ 能夠加快AMBER這款分子動力學模擬程序的速度。全球有6萬余名學術界和制葯公司的科研人員使用該程序來加速新葯開發。 在金融市場,Numerix和CompatibL已宣布在一款對手風險應用程序中支持英偉達™ CUDA™ ,而且因此實現了18倍速度提升。
在GPU計算領域中,英偉達™ Tesla™ GPU的大幅增長說明了英偉達™ CUDA™ 正被人們廣泛採用。 目前,全球《財富》五百強企業已經安裝了700多個GPU集群,從能源領域中的斯倫貝謝和雪佛龍到銀行業中的法國巴黎銀行,這些企業的范圍十分廣泛。
㈣ C# 怎樣生成20個隨機數,隨機數范圍為[10,100]
補充:
List<int> num=new List<int>();
for (int i = 0; i < 20; i++)
{
num[i] = random.Next(10, 101);//隨機數在10—100以內波動
label.text +=num[i].tostring()+",";
}