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核函数运行时间msCUDA数据从GPU到CPU的时间ms
2874190

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

 

具体数据


CUDA核函数运行时间msCUDA数据从GPU到CPU的时间msc++(不显示中间过程ms)显示过程msjava(不显示中间过程ms)显示过程mspython(不显示中间过程ms)fortran(不显示中间过程ms)显示过程ms
28741909675822884416244625593100717109126
17240997385731554917164492283102039109546
14141737365669192918335211503101634108775
1614153784571168621884*100651122592
1454097768566798661801*101487121870
1544145888814989221801*101261121646
1254152713790038601792*101379120226
1384105881795748331891*100606110631
1254167962797378511806*106303108145
1724093875787609161894*94476108237
1564101729781897861807 
1724109846828917351777 
1484040860791487851745
1414075870765698781737
1414088788791287541770
1744117779728478281895
1594122731740398521766
1254194656720049191863
1254122835767238581979 
1564074839775708571882
1414177840709299241747 
1494128833732779521861
1564100900739766591765
1414175747737947831830
1254092795734728131764
1254157849705847691784
1214067832723198341740
1254112809714758921810
1734082834728238181808
1584037766718478341684
平均 
151.0333334118.181572606.8333832.0666671801.866674776459.67101055.3114079.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));
 


 
 
 }



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑榆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值