CUDA与Java速度比较---生成Julia数据集并画图

在《GPU编程CUDA实战》第45页有个Julia数据集,本文把这个CUDA的程序改成了java的,然后每个程序运行20次,统计时间,比较这两个程序那个快些。



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


结果是惊人的,java完成同样的计算任务用的时间只有CUDA的15%,就这道题来说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 ;   //1
 
	    public static void main(String[] args)   
	    {  
	    	long sysDate1 = System.currentTimeMillis();
	    	
	    	julia1 qwe = new julia1();  //2
	    	

			  long sysDate2 = System.currentTimeMillis();

			  System.out.println(sysDate2-sysDate1 );
	    }  
	      
	    public julia1()  //3
	    {  
	        mp = new MyPanedrawjulia1();  //4
	          
	        this.add(mp);  
	        
	        this.setSize(3000,2000);  
	        this.setVisible(true);  
	        
	        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
	    }  
	}  
	  
	class MyPanedrawjulia1 extends JPanel    //用于绘图和实现绘图区域   //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生成图片





猜你喜欢

转载自blog.csdn.net/georgesale/article/details/80028713
今日推荐