NVIDIA 已经发布了他们的 Kepler Architecture.  CUDA toolkit 做了更新,以三代不同的 GTX cards (480, 580 and 680)来考察:
Matrix multiplication:

可以看到GTX 680 有 1 Terraflop 性能single precision, 而 GTX 580 接近.然而,680峰值约为2048×2048,然后会向下接近580性能。高端teslac2070的单精度在第三系列480之后。
对于双精度,C2070领先群雄。

Fast Fourier Transform:

从480到580的性能提升显著( 20% ) ,而680似乎没有比之前优越多少。快速傅立叶变换是一个测试,它使这些卡都在接近耗尽内存前达到峰值性能。2GB, 680可容纳两个8192 × 8192单精度复数矩阵,但该算法所需的暂存空间超过可用空间。所有的转换都是2D,实数到复数的变换。
SORT:

这里的GTX 680开始较强,但之后在GTX 580前失去了优势,并最终落后于480 。我们使用相同的基数排序算法为基准。令人吃惊的是,在高峰时 680慢了超过20%以上。
附件资源:
Benchmark Code
Benchmark Results
相关链接:
Tom’s hardware: LuxMark Benchmarks
Anandtech: Retaking the performance crown

测试代码使用arrayfire:
 

  1. #include <stdio.h>
  2. #include <arrayfire.h>
  3. using namespace af;
  4.  

  5. array in;
  6.  

  7. void bench_blas()
  8. {
  9.     array out = matmul(in, in);
  10. }
  11.  

  12. void bench_fft()
  13. {
  14.     array out = fft2(in);
  15. }
  16.  

  17. void bench_lu()
  18. {
  19.     array l, u;
  20.     lu(l, u, in);
  21. }
  22.  

  23. void bench_sort()
  24. {
  25.     array sorted = sort(in);
  26. }
  27.  

  28. int main(int argc, char **argv)
  29. {
  30.     af::deviceset(1);
  31.     af::info();
  32.     printf("Benching blas\n");
  33.     for (int n = 1024; n <= 8192; n+=1024) {
  34.         double time_s, time_d;
  35.         in = randu(n, n, f32);
  36.         time_s = timeit(bench_blas);
  37.         in = randu(n, n, f64);
  38.         time_d = timeit(bench_blas) : -1;
  39.         printf("[%4d x %4d] Single: %4.4lf Double: %4.4lf\n", n, n, time_s, time_d);
  40.     }
  41.     printf("\n\n");
  42.  

  43.     printf("Benching lu\n");
  44.     for (int n = 512; n <= 4096; n+=512) {
  45.         double time_s, time_d;
  46.         in = randu(n, n, f32);
  47.         time_s = timeit(bench_lu);
  48.         in = randu(n, n, f64);
  49.         time_d = timeit(bench_lu);
  50.         printf("[%4d x %4d] Single: %4.4lf Double: %4.4lf\n", n, n, time_s, time_d);
  51.     }
  52.     printf("\n\n");
  53.  

  54.     printf("Benching fft\n");
  55.     for (int n = 256; n <= 4096; n*=2) {
  56.         double time_s, time_d;
  57.         in = randu(n, n, f32);
  58.         time_s = timeit(bench_fft);
  59.         in = randu(n, n, f64);
  60.         time_d = timeit(bench_fft);
  61.         printf("[%4d x %4d] Single: %4.4lf Double: %4.4lf\n", n, n, time_s, time_d);
  62.     }
  63.     printf("\n\n");
  64.  

  65.     printf("Benching sort\n");
  66.     for (int n = 1024; n <= 50e6; n*=2) {
  67.         double time_s, time_d;
  68.         in = randu(n, 1, f32);
  69.         time_s = timeit(bench_sort);
  70.         in = randu(n, 1, f64);
  71.         time_d = timeit(bench_sort);
  72.         printf("[%8d x 1] Single: %4.4lf Double: %4.4lf\n", n, time_s, time_d);
  73.     }
  74.     printf("\n\n");
  75.  

  76.     return 0;
  77. }