如何在Octave中将多个参数传递给并行操作?

问题描述 投票:0回答:1

我编写了一个函数,该函数作用于输入矩阵中列的每个组合。它使用多个for循环,并且速度很慢,因此我试图对其进行并行化处理,以使用计算机上的最大线程数。

我很难找到正确的语法来进行设置。我正在使用倍频程中的Parallel软件包,并尝试了几种设置呼叫的方法。这里有两个,以简化的形式,以及我认为可行的非并行版本:

function A = parallelExample(M)
pkg load parallel;

# Get total count of columns
ct = columns(M);

# Generate column pairs
I = nchoosek([1:ct],2);
ops = rows(I);
slice = ones(1, ops);
Ic = mat2cell(I, slice, 2);

##  # Non-parallel
##  A = zeros(1, ops);
##  for i = 1:ops
##      A(i) = cmbtest(Ic{i}, M);
##  endfor

# Parallelized call v1
A = parcellfun(nproc, @cmbtest, Ic, {M});

## # Parallelized call v2
## afun = @(x) cmbtest(x, M);
## A = parcellfun(nproc, afun, Ic);

endfunction

# function to apply
function P = cmbtest(indices, matrix)

colset = matrix(:,indices);
product = colset(:,1) .* colset(:,2);
P = sum(product);

endfunction

对于这两个示例,我都会生成两列的每种组合,并将这些对转换为parcellfun函数应拆分的单元格数组。在第一个示例中,我尝试将输入矩阵M转换为1x1的单元数组,以便以相同的形式进入每个并行实例。我收到错误消息“ C必须是一个单元格数组”,但这必须在parcellfun函数内部。在第二篇文章中,我尝试定义一个包含矩阵的匿名函数。我在这里得到的错误表明'cmbtest'未定义。

(自然,我要应用的实际功能比这里的cmbtest复杂得多)

我尝试过的其他方法:

  • 将M放入全局变量,因此不需要传递它。尽管我可能只是语法问题,但似乎无法在函数文件中放入全局变量。
  • 使cmbtest成为嵌套函数,以便它可以访问M(parcellfun不支持该函数)

目前我还没有想法,可以使用帮助弄清楚如何使其起作用。

parallel-processing octave
1个回答
0
投票

将上面的评论转换为答案。

© www.soinside.com 2019 - 2024. All rights reserved.