主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

编写可移植的并行代码

您可以编写可移植的并行代码,如果使用 Parallel Computing Toolbox™,该代码将自动使用并行资源,如果没有 Parallel Computing Toolbox,该代码仍可运行。

本主题介绍如何:

  • 编写无需 Parallel Computing Toolbox 即可串行运行的可移植并行代码。

  • 编写在没有 Parallel Computing Toolbox 的情况下在后台运行的代码,如果有 Parallel Computing Toolbox 则使用更多的并行资源。

  • 编写自定义的可移植并行代码,该代码在没有 Parallel Computing Toolbox 的情况下在后台运行,如果有 Parallel Computing Toolbox 则使用更多的并行资源。

不使用 Parallel Computing Toolbox 以串行方式运行并行代码

您可以无需 Parallel Computing Toolbox 以串行方式运行以下并行语言功能:

如果您有 Parallel Computing Toolbox,要编写旨在使用并行池或集群的可移植并行代码,请使用支持自动并行的并行语言语法。如果您没有 Parallel Computing Toolbox,这些语法将按顺序运行。

若要编写可移植的并行代码(如果没有 Parallel Computing Toolbox,则会自动以串行方式运行),请不要为这些语言功能指定池参量。

作为最佳做法,仅当您需要指定环境来运行代码时才指定 Parallel Computing Toolbox 功能的池参量。如果没有为并行功能指定池参量,则该功能将运行:

  • 如果下列情况之一适用,则连续:

    • 您没有 Parallel Computing Toolbox

    • 您当前没有打开并行池,并且没有启用自动池创建

  • 在并行池中,如果您有 Parallel Computing Toolbox 并且以下情况之一适用:

    • 您当前有一个并行池处于打开状态

    • 您已启用自动池创建

如果您没有打开并行池并且启用了自动池创建,则可以使用默认集群配置文件打开池。有关设置默认集群配置文件的更多信息,请参阅 发现集群并使用集群配置文件

使用不带池的 parfeval 异步运行 magic(3) 并返回一个输出。如果没有 Parallel Computing Toolbox,该函数将串行运行。

f = parfeval(@magic,1,3)

使用不带池的 parfor 循环来运行具有不同矩阵大小的 magic。如果没有 Parallel Computing Toolbox,则循环将串行运行。

parfor i = 1:10
    A{i} = magic(i);
end

有关在没有 Parallel Computing Toolbox 的情况下串行运行的并行语言语法的信息,请参阅 Run Parallel Language in Serial

使用 backgroundPool 自动扩展

如果您有 Parallel Computing Toolbox,则使用 backgroundPool 的代码会自动扩展以使用更多可用核心。

有关后台自动扩大计算范围的更多信息,请参阅在基于线程的环境中运行 MATLAB 函数

在后台池上运行 parfor 循环

您可以使用 parforOptions 在后台池上运行 parfor 循环。

注意

当您使用后台池运行 parfor 循环时,MATLAB® 会暂停执行,直到循环完成。由于代码仍在后台运行,因此您只能使用基于线程的环境中支持的功能。

当您使用 parfevalbackgroundPool 在后台运行多个函数时,您的代码会扩展以使用更多可用核心。使用 parfeval 在后台运行 rand20 次。

for i = 1:20   
    f(i) = parfeval(backgroundPool,@rand,1);
end

要在后台运行 parfor 循环,请指定 backgroundPool 作为 parforOptions 的池参量,然后将结果用作 optsparfor 参量。

parfor (loopVal = initVal:endVal, parforOptions(backgroundPool))
    statements
end

编写自定义可移植并行代码

如果您编写了可移植并行代码,该代码可以在具有 Parallel Computing Toolbox 的情况下自动使用并行资源,则您创建的可移植并行代码存在以下限制:

  • 您无法自动启动 ThreadPool 来运行并行代码

  • 如果您没有 Parallel Computing Toolbox,您的代码将以串行方式运行

下面的 selectPool 函数返回后台池或并行池。您可以将 selectPool 作为池参量与并行语言功能(例如 parfevalparforOptions)一起使用。如果您有 Parallel Computing Toolbox 并启用了自动并行池创建,该函数将返回一个并行池。否则,它将返回后台池。

function pool = selectPool
    if canUseParallelPool
        pool = gcp;
    else
        pool = backgroundPool;
    end
end