【问题标题】:Porting a program to CUDA - kernel inside another kernel? [closed]将程序移植到 CUDA - 另一个内核中的内核? [关闭]
【发布时间】:2013-07-02 19:59:40
【问题描述】:

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

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 吗?

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

【问题讨论】:

  • 可以通过 dynamic parallelism 在另一个 CUDA 内核中调用内核,这适用于具有计算能力 >= 3.5 的卡。关于流,请查看simpleStreams SDK 示例。您可以考虑将在外部 for 循环中调用的内核的执行分配给不同的流,但是 1)执行必须是独立的; 2)我不知道你的卡是否真的支持并发内核执行。

标签: cuda gpu porting


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多