提起圆周率,不能不提及Fabrice Bellard,他被 认为是一位计算机天才,在业界有着重要的影响。1996年他编写了一个简洁 但是完整的C编译器和一个Java虚拟机Harissa。Fabrice Bellard发明的TinyCC是GNU/Linux环境下最小的ANSI C语言编译器,是目前号称编译速度最快的C编译器。Fabrice Bellard杰作 众多且涉及广泛,1998年编写了一个简洁的OpenGL实现TinyGL,2003年开发了Emacs克隆QEmacs,2005年还设计了一个廉价的数字电视系统。
Fabrice Bellard使用一台普通的台式电脑,完成了冲击由超级计算机保持的圆周率运算记录的壮举,他使用台式机将圆周率计算到了小数点后27万亿位,超过了由目前排名世界第47位的T2K Open超级计算机于去年8月份创造的小数点后25万亿位的记录。
Bellard使用的电脑是一台基于293GHz Core i7处理器的电脑,这部电脑的内存容量是6GB,硬盘则使用的是五块RAID-0配置的15TB容量的希捷720011,系统运行64位Red Hat Fedora 10 *** 作系统,文件系统则使用Linux的ext4
这次计算出来的圆周率数据占去了1137GB的硬盘容量,Bellard花了103天的时间计算出了这样的结果。
计算圆周率的方法有很多种:
微积分割圆法求:
或者利用便于计算机计算的丘德诺夫斯基公式法求:
不过这些计算方法都比较 复杂,难以让读者理解和使用并行计算来求,所幸数学上的泰勒级数是个好东西,它将微积分的东西改成用无限级数来表示,这样很容易进行并行计算分解:
π=4∑(-1)^n+1/(2n-1) 或者写为: π=4( 1-1/3+1/5-1/7+…)
也可以得到:πn =πn-1+(-1)^n+1/(2n-1),也就是可以通过迭代 前面的π值去求当前π值。
我们根据上面公式先写个单机程序来求:
public class PiTest{ public static void main(String[] args) { double pi=00; for(double i=10;i<1000000001d;i++){ pi += Mathpow(-1,i+1)/(2i-1); } Systemoutprintln(4pi); }}
运行以上程序,并对照pi的标准值:3141592653589793238462643383279…
如果i<10000,得到pi = 31416926635905345 (从红色部分以后不精确了)
如果i<1000000,得到pi = 31415936535907742 (从红色部分以后不精确了)
如果i<1000000000,得到pi = 31415926525880504(从红色部分以后不精确了)
……
可以看到,当迭代的轮数越大,求出的π值越精确。随着现代图形处理器(GPU)可编程能力及性能的提高,应用开发商们一直希望图形硬件可以解决以前只有通用CPU才能完成的高密集计算任务。尽管利用通用GPU进行计算很有发展前景,但传统图像应用编程接口仍然将GPU抽象成一个包括纹理、三角形和像素在内的图像绘制器。寻找一种能够使用这些基本元素的映射算法并不是一项简单的 *** 作,即便对最先进的图形开发商而言也是如此。
幸运的是,基于GPU的计算从概念上讲很容易理解,并且现有多种高级语言和软件工具可以简化GPU的编程工作。但是,开发商必须首先了解GPU在图像绘制过程中是如何工作的,然后才能确定可用于计算的各个组件。
在绘制图像时,GPU首先接收宿主系统以三角顶点形式发送的几何数据。这些顶点数据由一个可编程的顶点处理器进行处理,该处理器可以完成几何变换、亮度计算等任何三角形计算。接下来,这些三角形由一个固定功能的光栅器转换成显示在屏幕上的单独“碎片(fragment)”。在屏幕显示之前,每个碎片都通过一个可编程的碎片处理器计算最终颜色值。Golang提供了一些GPU编程库,例如CUDA、OpenCL和OpenACC等等。这些库允许您使用Golang编写并发的GPU应用程序。下面是使用Golang调用GPU的步骤:
1 确保您已经安装了CUDA、OpenCL或OpenACC。
2 使用Golang编写相应的GPU程序,例如使用CUDA编写的程序可以使用GoCudnn库。这个库提供了一系列用于GPU深度学习的函数,并且可以在Golang中轻松调用CUDA加速的算法。另外,还有Gorgonia库,该库使用了CUDA,OpenCL和TensorFlow等库,使得Golang具有快速计算张量的能力。
3 编写能够与GPU通信的代码,例如在CUDA中,你需要将Golang数据转换为相应的CUDA数据类型。
4 将代码编译为可执行文件。
5 运行程序并使用GPU执行计算 *** 作。
请注意,GPU编程需要一定的专业知识。如果您没有GPU编程经验,可以参考一些在线学习资源来了解相关的技术。Multiple GPUs on the desktop and computer clusters
using MATLAB workers in Parallel Computing Toolbox and MATLAB
Distributed Computing Server
如果你使用MATLAB的CPU并行应该知道matlabpool
当前,在matlab中如果调用多GPU那么需要开启多个pool,一个pool对应一个GPU,也就是一个CPU worker对应一块GPU,如
matlabpool 2
spmd
gpuDevice
end
spmd
if labindex ==1
gpuDevice(2);
end
end
spmd
gpuDevice
end
Lab 1:
ans =
CUDADevice with properties:
Name: 'Quadro FX 370'
Index: 2
ComputeCapability: '11'
SupportsDouble: 0
DriverVersion: 55000
ToolkitVersion: 5
MaxThreadsPerBlock: 512
MaxShmemPerBlock: 16384
MaxThreadBlockSize: [512 512 64]
MaxGridSize: [65535 65535 1]
SIMDWidth: 32
TotalMemory: 268435456
FreeMemory: NaN
MultiprocessorCount: 2
ClockRateKHz: 720000
ComputeMode: 'Default'
GPUOverlapsTransfers: 1
KernelExecutionTimeout: 1
CanMapHostMemory: 1
DeviceSupported: 0
DeviceSelected: 1
Lab 2:
ans =
CUDADevice with properties:
Name: 'Tesla K20c'
Index: 1
ComputeCapability: '35'
SupportsDouble: 1
DriverVersion: 55000
ToolkitVersion: 5
MaxThreadsPerBlock: 1024
MaxShmemPerBlock: 49152
MaxThreadBlockSize: [1024 1024 64]
MaxGridSize: [21475e+09 65535 65535]
SIMDWidth: 32
TotalMemory: 50330e+09
FreeMemory: 49166e+09
MultiprocessorCount: 13
ClockRateKHz: 705500
ComputeMode: 'Default'
GPUOverlapsTransfers: 1
KernelExecutionTimeout: 0
CanMapHostMemory: 1
DeviceSupported: 1
DeviceSelected: 1
更多内容可去matlabsky论坛上发帖分享>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)