[已答复] 难道广播变量不支持object类型?

[复制链接]
larlyii 发表于 2013-1-18 15:19:02
本帖最后由 larlyii 于 2013-1-18 15:20 编辑

刘老师您好!
    我想把parfor循环中需要用到的变量在parfor外赋值,作为广播变量,但结果报错,代码如下:
  1. SNR = 5:10; % 信噪比
  2. Tx_h = modem.qammod('M', M, 'SymbolOrder', 'Gray', 'InputType', 'Bit'); % QPSK的object
  3. parfor SNRIdx = 1 : length(SNR)
  4.     m = randi([0 1], 100); % 信源产生
  5.     X = modulate(Tx_h, m); % QPSK调制
  6. end
复制代码
报错如下:
Error using parallel_function (line 598)
Not enough input arguments.
Error stack:
modulate.m at 50

Error in temp3 (line 3)  // 这里temp3是m文件名
parfor SNRIdx = 1 : length(SNR)

但是如果我把Tx_h的生成放在parfor里面,就没有任何问题,如下:
  1. SNR = 5:10; % 信噪比
  2. parfor SNRIdx = 1 : length(SNR)
  3.     Tx_h = modem.qammod('M', M, 'SymbolOrder', 'Gray', 'InputType', 'Bit'); % QPSK的object
  4.     m = randi([0 1], 100); % 信源产生
  5.     X = modulate(Tx_h, m); % QPSK调制
  6. end</FONT>
复制代码
本来在parfor循环中是不会对Tx_h赋值的,所以把他作为广播变量理所当然,但实际情况确实这样,难道广播变量不支持object类型?我也尝试了其他的object放在parfor外面,结果类似,也是报错。郁闷~

3 条回复


刘维 发表于 2013-1-22 00:53:31
object比较复杂,如果不涉及本地资源的话,在spmd中应该没问题。有些时候,object构造时设计本地资源,如本地函数、本地变量、本地文件等,在这种情况下不能当作普通的广播变量。此时,变量传输不仅仅是赋值这么简单。所以,最好的办法是:
(1)将构造object的变量作为broadcast变量
(2)在worker上构造object

larlyii 发表于 2013-1-22 19:46:25
如刘老师您所说,我的第二段代码就是在worker上构造object,那你第(1)点将构造object的变量作为broadcast变量,是什么意思啊?是要人为指定他为广播变量吗?人为指定怎么指定呀?

刘维 发表于 2013-1-30 05:42:17
你构造类对象的话,肯定需要一些变量(或数据)。将这些变量作为broadcast变量,然后在worker上使用这些变量直接构造类对象即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表