CUDA,C++,Java,Python,Fortran运行速度比较

通过计算100万以内素数的运行时间比较这5种语言的运行速度。

每种语言运行30次,取平均值。由于python和fortran的运行速度和Java和C++运行差距过大,python只计算了3次,Fortran运行了10次.

C++,Java,Python,Fortran到底哪个更快?

C++的速度比Java2.1%:来自计算100万以内质数的实验数据对比

各种语言的语法要求不同,算法只能尽可能写的一致。

这两篇文里对前期的实验有更详细的解释。


CUDA统计了核函数的运行时间,和数据从GPU传回CPU的时间

比如第一组数据


CUDA核函数运行时间ms CUDA数据从GPU到CPU的时间ms
287 4190

用时287毫秒GPU就把100万以内的素数程序运行完了,又用了4190毫秒这些结果从GPU传回CPU。

具体数据


CUDA核函数运行时间ms CUDA数据从GPU到CPU的时间ms c++(不显示中间过程ms) 显示过程ms java(不显示中间过程ms) 显示过程ms python(不显示中间过程ms) fortran(不显示中间过程ms) 显示过程ms
287 4190 967 58228 844 1624 4625593 100717 109126
172 4099 738 57315 549 1716 4492283 102039 109546
141 4173 736 56691 929 1833 5211503 101634 108775
161 4153 784 57116 862 1884 * 100651 122592
145 4097 768 56679 866 1801 * 101487 121870
154 4145 888 81498 922 1801 * 101261 121646
125 4152 713 79003 860 1792 * 101379 120226
138 4105 881 79574 833 1891 * 100606 110631
125 4167 962 79737 851 1806 * 106303 108145
172 4093 875 78760 916 1894 * 94476 108237
156 4101 729 78189 786 1807  
172 4109 846 82891 735 1777  
148 4040 860 79148 785 1745
141 4075 870 76569 878 1737
141 4088 788 79128 754 1770
174 4117 779 72847 828 1895
159 4122 731 74039 852 1766
125 4194 656 72004 919 1863
125 4122 835 76723 858 1979  
156 4074 839 77570 857 1882
141 4177 840 70929 924 1747  
149 4128 833 73277 952 1861
156 4100 900 73976 659 1765
141 4175 747 73794 783 1830
125 4092 795 73472 813 1764
125 4157 849 70584 769 1784
121 4067 832 72319 834 1740
125 4112 809 71475 892 1810
173 4082 834 72823 818 1808
158 4037 766 71847 834 1684
平均  
151.033333 4118.1 815 72606.8333 832.066667 1801.86667 4776459.67 101055.3 114079.4
 
1 * 5.39615979 * 5.50915913 * 31625.2019 * 755.325977


计算结果

CUDA   >   C++   >   Java    >   Fortran   >   Python

151       <   815    <   832     <   114079  <   4776459

1           <    5.40   <   5.5      <   755        <    31625

也就是对这道题来说CUDA的速度是C++的5.4倍,是Java的5.5倍 ,是Fortran的755倍,是Python 的31625倍。相比较Java和C++相当于节省了80%的时间,或者一台机器当5台用。

具体程序


#include "book.h"
#include "cuda_runtime.h"
#include "cpu_bitmap.h"

#include<iostream>
#include <time.h>

using namespace std;


#define DIM 1000

/****************************************/


__device__ int julia(int x ,int y){


     int  j=2; 
     int i=x*DIM+y;
    
    int a=0;
   
       
        for(j=2; j <= (i/j); j++) {
            if(!(i%j)) {
                break; 
            }
        }
        
        
        if(j > (i/j)) {
       
         return 1;
        }
        
       
        if(j <= (i/j)) {
       
         return 0;
        }
        
       
 }
 
 
 
 
 __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);
 
 //printf("%d , %d\n " ,offset , juliaValue);
 
 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,end1,end2; 
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);
 
 end1=clock();
 cout<<(end1-start)*1000/CLOCKS_PER_SEC <<endl; 
 
 HANDLE_ERROR (cudaMemcpy (bitmap.get_ptr(),dev_bitmap,bitmap.image_size(),cudaMemcpyDeviceToHost ));
                           
  end2=clock();
 cout<<(end2-end1)*1000/CLOCKS_PER_SEC <<endl;        
                       
                           
 bitmap.display_and_exit();
 
 
 
 HANDLE_ERROR (cudaFree(dev_bitmap));
 


 
 
 }



猜你喜欢

转载自blog.csdn.net/georgesale/article/details/80066002