CUDA与Java速度比较---生成Julia数据集并画图
生活随笔
收集整理的這篇文章主要介紹了
CUDA与Java速度比较---生成Julia数据集并画图
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在《GPU編程CUDA實(shí)戰(zhàn)》第45頁(yè)有個(gè)Julia數(shù)據(jù)集,本文把這個(gè)CUDA的程序改成了java的,然后每個(gè)程序運(yùn)行20次,統(tǒng)計(jì)時(shí)間,比較這兩個(gè)程序那個(gè)快些。
| java(ms) | c++(ms) |
| 202 | 1904 |
| 269 | 1850 |
| 228 | 1737 |
| 242 | 1712 |
| 181 | 1770 |
| 222 | 1774 |
| 272 | 1733 |
| 295 | 1681 |
| 238 | 1320 |
| 282 | 1725 |
| 248 | 1833 |
| 294 | 1478 |
| 264 | 1692 |
| 176 | 1431 |
| 229 | 1479 |
| 230 | 1457 |
| 256 | 1645 |
| 193 | 1802 |
| 239 | 1208 |
| 230 | 1537 |
| ? | |
| 239.5 | 1638.4 |
結(jié)果是驚人的,java完成同樣的計(jì)算任務(wù)用的時(shí)間只有CUDA的15%,就這道題來(lái)說(shuō)Java的速度是CUDA的5.8倍.
?
CUDA程序
#include "book.h" #include "cuda_runtime.h" #include "cpu_bitmap.h"#include<iostream> #include <time.h>using namespace std;#define DIM 1000/****************************************/struct cuComplex {float r; float i;__device__ cuComplex(float a,float b) : r(a),i(b) {}__device__ float magnitude2(void){ return r*r+i*i; }__device__ cuComplex operator*(const cuComplex& a) { return cuComplex(r*a.r-i*a.i, i*a.r+r*a.i); }__device__ cuComplex operator+(const cuComplex& a){return cuComplex(r+a.r,i+a.i); }};/***************************************/__device__ int julia(int x ,int y){const float scale =2;float jx=scale*(float)(DIM/2-x)/(DIM/2); float jy=scale*(float)(DIM/2-y)/(DIM/2);cuComplex c(-0.8,0.156); cuComplex a(jx,jy);int i=0;for(i=0 ;i<200; i++){a=a*a+c;if(a.magnitude2()>1000)return 0;}return 1;}__global__ void kernel(unsigned char *ptr){int x=blockIdx.x;int y=blockIdx.y;int offset=x+y*gridDim.x;int juliaValue=julia(x,y);ptr[offset*4+0]=255*juliaValue;ptr[offset*4+1]=0; ptr[offset*4+2]=0; ptr[offset*4+3]=255;}int main(void){clock_t start,ends; start=clock();CPUBitmap bitmap(DIM,DIM);unsigned char *dev_bitmap;HANDLE_ERROR (cudaMalloc( (void**)&dev_bitmap,bitmap.image_size()));dim3 grid(DIM,DIM);kernel<<< grid,1>>>(dev_bitmap);HANDLE_ERROR (cudaMemcpy (bitmap.get_ptr(),dev_bitmap,bitmap.image_size(),cudaMemcpyDeviceToHost ));ends=clock();cout<<(ends-start)*1000/CLOCKS_PER_SEC <<endl; bitmap.display_and_exit();HANDLE_ERROR (cudaFree(dev_bitmap));}
Java程序
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.io.FileWriter; import java.io.IOException; import java.text.DecimalFormat;import javax.swing.JFrame; import javax.swing.JPanel;public class julia1 extends JFrame {MyPanedrawjulia1 mp = null ; //1public static void main(String[] args) { long sysDate1 = System.currentTimeMillis();julia1 qwe = new julia1(); //2long sysDate2 = System.currentTimeMillis();System.out.println(sysDate2-sysDate1 );} public julia1() //3{ mp = new MyPanedrawjulia1(); //4this.add(mp); this.setSize(3000,2000); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MyPanedrawjulia1 extends JPanel //用于繪圖和實(shí)現(xiàn)繪圖區(qū)域 //5{ public void paint(Graphics g) { super.paint(g); try {julia( g );} catch (IOException e1) {e1.printStackTrace();}}private void julia(Graphics g) throws IOException{g.setFont(new Font("宋體",Font.BOLD,20));int dim=1000;double c=-0.8;double d=0.156;double rate=1.6;DecimalFormat df = new DecimalFormat( "0.0000000000");for(double a=1 ;a<1000;a++){for(double b=1 ;b<1000;b++){double p1=rate*(dim/2-a)/(dim/2);double p2=rate*(dim/2-b)/(dim/2);double sum=0;for( int n=0 ;n<200;n++ ){double r1=0.0;double r2=0.0;r1=Math.pow(p1, 2)-Math.pow(p2, 2)+c;r2=2*p1*p2+d;p1=r1;p2=r2;sum=sum+(Math.pow(p1, 2)+Math.pow(p2, 2));if (sum>1000){break;}}if(sum<1000){//System.out.println(a+" ***** "+b +" "+sum+" " );g.setColor(Color.red); g.drawOval((int)(a), (int)(b),2, 2);}/*************************************************/}}} }
CUDA生成圖片
Java生成圖片
總結(jié)
以上是生活随笔為你收集整理的CUDA与Java速度比较---生成Julia数据集并画图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QSAR生命的发动机卟啉c20h14n4
- 下一篇: CUDA,C++,Java,Python