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

用神经网络模拟原子 专栏收录该内容
286 篇文章 0 订阅

在《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程序


  1. #include "book.h"
  2. #include "cuda_runtime.h"
  3. #include "cpu_bitmap.h"
  4. #include<iostream>
  5. #include <time.h>
  6. using namespace std;
  7. #define DIM 1000
  8. /****************************************/
  9. struct cuComplex {
  10. float r;
  11. float i;
  12. __device__ cuComplex(float a,float b) : r(a),i(b) {}
  13. __device__ float magnitude2(void){
  14. return r*r+i*i;
  15. }
  16. __device__ cuComplex operator*(const cuComplex& a) {
  17. return cuComplex(r*a.r-i*a.i, i*a.r+r*a.i);
  18. }
  19. __device__ cuComplex operator+(const cuComplex& a){
  20. return cuComplex(r+a.r,i+a.i);
  21. }
  22. };
  23. /***************************************/
  24. __device__ int julia(int x ,int y){
  25. const float scale =2;
  26. float jx=scale*(float)(DIM/2-x)/(DIM/2);
  27. float jy=scale*(float)(DIM/2-y)/(DIM/2);
  28. cuComplex c(-0.8,0.156);
  29. cuComplex a(jx,jy);
  30. int i=0;
  31. for(i=0 ;i<200; i++){
  32. a=a*a+c;
  33. if(a.magnitude2()>1000)
  34. return 0;
  35. }
  36. return 1;
  37. }
  38. __global__ void kernel(unsigned char *ptr){
  39. int x=blockIdx.x;
  40. int y=blockIdx.y;
  41. int offset=x+y*gridDim.x;
  42. int juliaValue=julia(x,y);
  43. ptr[offset*4+0]=255*juliaValue;
  44. ptr[offset*4+1]=0;
  45. ptr[offset*4+2]=0;
  46. ptr[offset*4+3]=255;
  47. }
  48. int main(void){
  49. clock_t start,ends;
  50. start=clock();
  51. CPUBitmap bitmap(DIM,DIM);
  52. unsigned char *dev_bitmap;
  53. HANDLE_ERROR (cudaMalloc( (void**)&dev_bitmap,bitmap.image_size()));
  54. dim3 grid(DIM,DIM);
  55. kernel<<< grid,1>>>(dev_bitmap);
  56. HANDLE_ERROR (cudaMemcpy (bitmap.get_ptr(),dev_bitmap,bitmap.image_size(),cudaMemcpyDeviceToHost ));
  57. ends=clock();
  58. cout<<(ends-start)*1000/CLOCKS_PER_SEC <<endl;
  59. bitmap.display_and_exit();
  60. HANDLE_ERROR (cudaFree(dev_bitmap));
  61. }

Java程序


  1. import java.awt.Color;
  2. import java.awt.Font;
  3. import java.awt.Graphics;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.text.DecimalFormat;
  7. import javax.swing.JFrame;
  8. import javax.swing.JPanel;
  9. public class julia1 extends JFrame {
  10. MyPanedrawjulia1 mp = null ; //1
  11. public static void main(String[] args)
  12. {
  13. long sysDate1 = System.currentTimeMillis();
  14. julia1 qwe = new julia1(); //2
  15. long sysDate2 = System.currentTimeMillis();
  16. System.out.println(sysDate2-sysDate1 );
  17. }
  18. public julia1() //3
  19. {
  20. mp = new MyPanedrawjulia1(); //4
  21. this.add(mp);
  22. this.setSize(3000,2000);
  23. this.setVisible(true);
  24. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  25. }
  26. }
  27. class MyPanedrawjulia1 extends JPanel //用于绘图和实现绘图区域 //5
  28. {
  29. public void paint(Graphics g)
  30. {
  31. super.paint(g);
  32. try {
  33. julia( g );
  34. } catch (IOException e1) {
  35. e1.printStackTrace();
  36. }
  37. }
  38. private void julia(Graphics g) throws IOException
  39. {
  40. g.setFont(new Font("宋体",Font.BOLD,20));
  41. int dim=1000;
  42. double c=-0.8;
  43. double d=0.156;
  44. double rate=1.6;
  45. DecimalFormat df = new DecimalFormat( "0.0000000000");
  46. for(double a=1 ;a<1000;a++)
  47. {
  48. for(double b=1 ;b<1000;b++)
  49. {
  50. double p1=rate*(dim/2-a)/(dim/2);
  51. double p2=rate*(dim/2-b)/(dim/2);
  52. double sum=0;
  53. for( int n=0 ;n<200;n++ )
  54. {
  55. double r1=0.0;
  56. double r2=0.0;
  57. r1=Math.pow(p1, 2)-Math.pow(p2, 2)+c;
  58. r2=2*p1*p2+d;
  59. p1=r1;
  60. p2=r2;
  61. sum=sum+(Math.pow(p1, 2)+Math.pow(p2, 2));
  62. if (sum>1000)
  63. {
  64. break;
  65. }
  66. }
  67. if(sum<1000)
  68. {
  69. //System.out.println(a+" ***** "+b +" "+sum+" " );
  70. g.setColor(Color.red);
  71. g.drawOval((int)(a), (int)(b),2, 2);
  72. }
  73. /*************************************************/
  74. }
  75. }
  76. }
  77. }

CUDA生成图片




Java生成图片





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

抵扣说明:

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

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
新手
引导
客服 举报 返回
顶部