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 ; //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数据集并画图相关推荐
- JAVA实现随机生成航班数据
JAVA实现随机生成航班数据 实现效果:通过java实现随机生成航班数据并保存到数据库 页面请求调用 先获取要生成数据的月份等参数,然后进行请求,对返回结果进行回填并不断递归调用. function ...
- 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 ...
- JAVA实现Freemarker生成动态数据的Word文档下载到浏览器
使用的jar包版本:freemarker-2.3.28.jar 使用开发工具:idea 1. 创建模板: 新建一个word文档,打开后编辑成想要的格式 动态数据替换成${xxx},如果是多条集合用${ ...
- JAVA实现PDF和EXCEL生成和数据动态插入以及导出
作者:Tom-shushu www.cnblogs.com/Tom-shushu/p/14 一.序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便 ...
- Java实现pdf和Excel的生成及数据动态插入、导出
点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 作者:慢时光 cnblogs.com/Tom-shushu/ ...
- Java技术:实现pdf和Excel的生成及数据动态插入、导出
1 序言 Excel.PDF的导出.导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策. 公司有这么两个需求: 需求一.给了一个表单,让把 ...
- Java生成CRC16数据校验码
CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数 ...
- Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】
[Bootstrap4前端框架+MySQL数据库]前后端综合实训[10天课程 博客汇总表 详细笔记][附:实训所有代码] 目录 MD5加码 生成32位md5码 ResultData.java 分页查询 ...
- Java mock客户端数据_CatMock: Java 下使用 mock.js 生成虚拟数据
CatMock CatMock 是一个mock.js的 Java 封装库.使用 JDK 自带的 js 脚本引擎直接调用 mock.js 脚本,实现对 mock.js 的统一. 为什么采用这样的方案? ...
最新文章
- python 按照要求对字符串进行处理
- Java troubleshooting guide
- Java注解库_Java 注解详解
- 微信小程序适配iPhone X
- 分类素材(part3)--python机器学习基础教程(下)
- CCNP课堂练习四:frame-relay traffic-shaping(帧中继流量×××)
- 1285B. Just Eat It
- 哈希值+非对称加密+网络+数字签名,你真的知道怎么给游戏充钱吗
- Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)
- 串行口通信c语言代码,问一下单片机串行口通信用c语言实现的问题
- C#中通过Selenium定位a标签的问题
- 《Total Commander:万能文件管理器》——第9.6节.后记
- Linux自建yum仓及相关知识详解
- linux 应用程序 死锁,程序死锁了
- html凹凸感设置,想让VRAY渲染的图有点凹凸效果怎么做?
- Tableau 工作簿 打不开报错问题 A19C3D8C
- 材料专业转行适合做什么
- mac 平台显示歌词最好的音乐播放器软件 —— Vox + LyricsX
- 二叉树:已知先序和中序求后序,已知中序和后序求先序
- C 水仙花数 一个3位数,其中各位数字立方和等于该数本身