㈠ 关于圆周率的历史资料
古希腊作为古代几何王国对圆周率的贡献尤为突出。古希腊大数学家阿基米德(公元前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()+",";
}