通过计算100万以内素数的运行时间比较这5种语言的运行速度。
每种语言运行30次,取平均值。由于python和fortran的运行速度和Java和C++运行差距过大,python只计算了3次,Fortran运行了10次.
《C++,Java,Python,Fortran到底哪个更快?》
《C++的速度比Java快2.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));
}