我创建了两个函数:生成数据和处理数据。数据处理很耗时,所以我想在并行线程中处理它们。但我对他们有一些问题。首先,这是我的程序:
result = zeros(1, 10);
matlabpool open local 2
spmd
for a = 1:5
data = generate_data();
display(sprintf('Received data on CPU%d: %d', labindex, data));
result(end + 1) = process_data(data);
end
display(sprintf('All done on CPU%d', labindex));
end
matlabpool close
以及它返回的日志:
Starting matlabpool using the 'local' profile ... connected to 2 workers.
Lab 1:
Received data on CPU1: 100
Lab 2:
Received data on CPU2: 100
Lab 1:
Received data on CPU1: 101
Received data on CPU1: 102
Received data on CPU1: 103
Received data on CPU1: 104
All done on CPU1
Lab 2:
Received data on CPU2: 101
Received data on CPU2: 102
Received data on CPU2: 103
Received data on CPU2: 104
All done on CPU2
Sending a stop signal to all the workers ... stopped.
有问题,我有:
generate_data 返回的值是相同的
两个线程。我应该有所不同。线程应该处理不同的
数据,而不是相同的数据两次。我无法生成完整的数据
立即设置并使用 getLocalPart。
变量结果不是双精度数的 1x10 矩阵,而是双精度数的 1x2 矩阵
复合材料。我读过有关(共)分布式数组的内容,但没有帮助
我。我应该怎么做才能收到 1x10 双打矩阵?
当CPU1处理CPU2的数据时,我应该做什么
处理自己的数据?一般来说,我不知道如何做到这一点。
可以删除“实验室 1:”和“实验室 2:”吗?他们在搞乱
我的日志:)
考虑到上述情况,日志(对于较大的数据集)应该如下所示:
Starting matlabpool using the 'local' profile ... connected to 2 workers.
Received data on CPU1: 100
Received data on CPU2: 101
Received data on CPU1: 102
Received data on CPU1: 103
Received data on CPU1: 104
Received data on CPU1: 105
Received data on CPU2: 106
Received data on CPU1: 107
Received data on CPU1: 108
Received data on CPU2: 109
All done on CPU1
All done on CPU2
Sending a stop signal to all the workers ... stopped.
你为什么不使用更简单的parfor
?目前,您正在每个工作人员上运行循环,并且我假设您希望并行运行循环的迭代。
nIter = 10;
result = zeros(1, nIter);
matlabpool open local 2
parfor a = 1:nIter
data = generate_data();
fprintf('%s: processing set %i/%i\n',datestr(now),a,nIter)
result(a) = process_data(data);
end
end
matlabpool close
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)