在《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 ;   //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    //用于绘图和实现绘图区域   //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生成图片

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

  1. JAVA实现随机生成航班数据

    JAVA实现随机生成航班数据 实现效果:通过java实现随机生成航班数据并保存到数据库 页面请求调用 先获取要生成数据的月份等参数,然后进行请求,对返回结果进行回填并不断递归调用. function ...

  2. java解析与生成json数据的四种方式,比如将json字符串转为json对象或json对象转为json字符串

    文章目录 1. 详说json 1.1 何为json 1.2 json语法 2. Java解析与生成JSON的四种方式 2.1 传统方式 2.2 利用Jackson方式 2.3 利用Gson方式 2.4 ...

  3. JAVA实现Freemarker生成动态数据的Word文档下载到浏览器

    使用的jar包版本:freemarker-2.3.28.jar 使用开发工具:idea 1. 创建模板: 新建一个word文档,打开后编辑成想要的格式 动态数据替换成${xxx},如果是多条集合用${ ...

  4. JAVA实现PDF和EXCEL生成和数据动态插入以及导出

    作者:Tom-shushu www.cnblogs.com/Tom-shushu/p/14 一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便 ...

  5. Java实现pdf和Excel的生成及数据动态插入、导出

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 作者:慢时光 cnblogs.com/Tom-shushu/ ...

  6. Java技术:实现pdf和Excel的生成及数据动态插入、导出

    1 序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...

  7. Java生成CRC16数据校验码

    CRC即循环冗余校验码(Cyclic Redundancy Check[1]  ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数 ...

  8. Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】

    [Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目录 MD5加码 生成32位md5码 ResultData.java 分页查询 ...

  9. Java mock客户端数据_CatMock: Java 下使用 mock.js 生成虚拟数据

    CatMock CatMock 是一个mock.js的 Java 封装库.使用 JDK 自带的 js 脚本引擎直接调用 mock.js 脚本,实现对 mock.js 的统一. 为什么采用这样的方案? ...

最新文章

  1. python 按照要求对字符串进行处理
  2. Java troubleshooting guide
  3. Java注解库_Java 注解详解
  4. 微信小程序适配iPhone X
  5. 分类素材(part3)--python机器学习基础教程(下)
  6. CCNP课堂练习四:frame-relay traffic-shaping(帧中继流量×××)
  7. 1285B. Just Eat It
  8. 哈希值+非对称加密+网络+数字签名,你真的知道怎么给游戏充钱吗
  9. Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)
  10. 串行口通信c语言代码,问一下单片机串行口通信用c语言实现的问题
  11. C#中通过Selenium定位a标签的问题
  12. 《Total Commander:万能文件管理器》——第9.6节.后记
  13. Linux自建yum仓及相关知识详解
  14. linux 应用程序 死锁,程序死锁了
  15. html凹凸感设置,想让VRAY渲染的图有点凹凸效果怎么做?
  16. Tableau 工作簿 打不开报错问题 A19C3D8C
  17. 材料专业转行适合做什么
  18. mac 平台显示歌词最好的音乐播放器软件 —— Vox + LyricsX
  19. 二叉树:已知先序和中序求后序,已知中序和后序求先序
  20. C 水仙花数 一个3位数,其中各位数字立方和等于该数本身

热门文章

  1. G - Bad Hair Day (单调栈)
  2. Java抽象类和接口
  3. GWT interface的使用例子
  4. PHP文件操作常用函数总结
  5. JavaScript学习总结(五)——Javascript中==和===的区别
  6. C#支持中文的格式化字符长度方法
  7. Eclipse tomcat Web页面调试
  8. SVN Switch
  9. F(n)完全覆盖中的计数问题
  10. java正则替换标点