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

本文对比了使用Java和CUDA编程实现Julia集计算的性能。通过20次运行实验,结果显示Java版本的程序在完成相同计算任务时比CUDA版本快约5.8倍。

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



java(ms)c++(ms)
2021904
2691850
2281737
2421712
1811770
2221774
2721733
2951681
2381320
2821725
2481833
2941478
2641692
1761431
2291479
2301457
2561645
1931802
2391208
2301537
 
239.51638.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生成图片





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑榆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值