-2

我正在尝试并行化包含多个过程的函数。功能如下:

void _myfunction(M1,M2){
    for (a = 0; a < A; a++) {
       Amatrix = procedure1(M1) /*contains for loops*/;
       Bmatrix = procedure2(M1) /*contains for loops*/;

       ...
       for ( z = 1 ; z < Z ; z++ ){
                 calculations with Amatrix(z) and obtain AAmatrix 
                 calculations with Bmatrix(z) and obtain BBmatrix    
          for ( e = 1; e < E; e++) { 
                 calculations with AAmatrix(e) and obtain CCmatrix 
                 calculations with BBmatrix(e) and obtain DDmatrix
          }
       }
       for (q = 0; q < Q; q++){ calculations with CCMatrix(q) }
       for (m = 0; m < M; m++){ calculations with DDMatrix(q) }
    }
}

关于函数procedure1()procedure2(),我已经将它们移植到 CUDA 并且一切正常(这些过程中的每一个都有自己的 for 循环)。将这些过程分开的原因是因为它们在概念上是独立的算法,与具有更一般概念的其余代码相反。

现在我正在尝试将其余代码移植到 CUDA,但我不确定该怎么做。当然,如果可能的话,我想保持整个函数的相同结构。我的第一个想法是将函数_myfunction(arg1,arg2,..)转换为内核,但我的问题是已经有两个内核函数在内部按顺序执行。我在某处读到我们可以使用流,但我再次不确定如何去做以及它是否正确。

问题:有人可以提示如何将程序移植到 CUDA 吗?

PS:我使用的是 GeForce 9600GT(Compute Capability 1.1)和 CUDA Toolkit 5.0。

4

1 回答 1

2

在CUDA 中可能无法实现相同的结构 理论,因为该问题可能无法并行化。这基本上是由于问题的性质。在您的设备中,您不能从另一个内核中启动内核。这种机制被称为并且是最近才出现的。计算能力不支持这一点。据我所知,动态并行是从 CUDA Kepler 架构开始引入的。您必须进行一些研究以检查哪些设备支持此功能(当然,如果您有兴趣)。总而言之,您将无法使用相同的结构理论来实现这一点。但这并不意味着Dynamic Parallelism1.1 你根本无法实现它。以下是我的建议,以便移植您和任何其他程序:

  1. 阅读CUDA C 编程指南CUDA C 最佳实践指南(假设您使用 CUDA C)
  2. 重组/重新思考原始问题,看看它是否可以并行化。
  3. 对代码执行静态分析。(基本上阅读代码并根据您的编程知识使事情变得更快)
  4. 对您的代码执行动态分析。您可以通过工具来实现这一点。我会推荐Valgrind。它具有广泛的用途,它是免费的,它有许多不同的模块可以帮助您检查程序的不同方面,并且在很多平台上都支持它。我用过,觉得不错
  5. 在这两个分析之后,您可以在程序中寻找有问题的点,例如占用程序大部分执行时间的点。
  6. 尝试并行化这些点。正如我所说,结构不必相同。

注意#1:作为你的新手,前两个阅读是强制性的,否则你会在调试上花费很多。注意#2:如果您在程序中没有发现问题点,我非常怀疑您是否可以使用 CUDA 加速您的代码。但我想说,这是一个极端的例子。

于 2013-07-05T08:09:38.927 回答