相关疑难解决方法(0)

OpenMP:堆数组性能不佳(堆栈数组工作正常)

我是一个相当有经验的OpenMP用户,但我遇到了一个令人费解的问题,我希望有人可以提供帮助.问题是,一个简单的哈希算法对堆栈分配的数组表现良好,但对堆上的数组表现不佳.

下面的示例使用i%M(i模数M)来计算相应阵列元素中的每个第M个整数.为简单起见,假设N = 1000000,M = 10.如果N%M == 0,那么结果应该是bins []的每个元素都等于N/M:

#pragma omp for
  for (int i=0; i<N; i++) 
    bins[ i%M ]++;
Run Code Online (Sandbox Code Playgroud)

数组bins []对每个线程都是私有的(我在之后对关键部分中所有线程的结果进行求和).

当在堆栈上分配bins []时,程序运行良好,性能与内核数量成比例缩放.

但是,如果bin []在堆上(指向bin []的指针在堆栈上),性能会急剧下降.这是一个重大问题!

我希望使用OpenMP将某些数据的binning(散列)并行化为堆数组,这是一个重大的性能影响.

绝对不是像所有线程试图写入同一内​​存区域那样愚蠢的东西.这是因为每个线程都有自己的bins []数组,结果对于堆栈和堆栈分配的bin都是正确的,并且单线程运行的性能没有差别.我使用GCC和英特尔C++编译器在不同的硬件(Intel Xeon和AMD Opteron)上重现了这个问题.所有测试都在Linux(Ubuntu和RedHat)上进行.

似乎没有理由将OpenMP的良好性能限制在堆栈数组中.

任何猜测?也许对线程的访问是通过Linux上的某种共享网关进行的?我该如何解决这个问题?

完整的程序如下:

#include <stdlib.h>
#include <stdio.h>
#include <omp.h>

int main(const int argc, const char* argv[])
{
  const int N=1024*1024*1024;
  const int M=4;
  double t1, t2;
  int checksum=0;

  printf("OpenMP threads: %d\n", omp_get_max_threads());

  //////////////////////////////////////////////////////////////////
  // Case 1: stack-allocated array
  t1=omp_get_wtime();
  checksum=0;
#pragma omp parallel
  { // Each openmp thread …
Run Code Online (Sandbox Code Playgroud)

heap performance stack multithreading openmp

20
推荐指数
1
解决办法
6275
查看次数

FORTRAN 77程序比Fortran 90程序快吗?

今天我正在阅读FORTRAN 77中编写的一些非常流行的数字库中的代码,例如QUADPACK(最近更新于1987年),我想知道是否有任何理由不在Fortran 90中重写这些库,除了大量工作之外鉴于Fortran 90为语言带来了巨大的改进,包括自由形式的源代码,更好的控制结构,因此可以忘记GO TO,矢量化,接口等等.

是因为FORTRAN 77编译器生成更优化的代码,也许它更适合并行执行?请注意,我甚至没有谈论Fortran 2003,这只有 8年的历史:我在谈论Fortran 90,所以我认为它已经足够广泛并且编译器已经准备好了.无论如何,我没有与业界联系.

编辑:janneb是对的:LAPACK实际上是用Fortran 90编写的.

legacy fortran fortran77 fortran90

7
推荐指数
3
解决办法
4797
查看次数