SAS中的并行处理,等待空闲会话

SAS中的并行处理,等待空闲会话,sas,Sas,假设我有两个已签署的会话: signon slave1; signon slave2; 假设我有10份工作由 %execute_job( parameter= 1); %execute_job( parameter= 2); %execute_job( parameter= 3); . . . %execute_job( parameter= 10); 我需要在%execute_作业中添加什么,以便它继续等待空闲会话并将作业提交到找到的第一个空闲会话 我试过macvar的东西,但没有用。好吧

假设我有两个已签署的会话:

signon slave1;
signon slave2;
假设我有10份工作由

%execute_job( parameter= 1);
%execute_job( parameter= 2);
%execute_job( parameter= 3);
.
.
.
%execute_job( parameter= 10);
我需要在%execute_作业中添加什么,以便它继续等待空闲会话并将作业提交到找到的第一个空闲会话


我试过macvar的东西,但没有用。

好吧,我想我得到了一些东西:

options sascmd="!sascmd";


%macro job(value);

    %local slave_id;

    %let slave_id = 1;

    %do  %while(&&slave&slave_id.);
        %put Slave&slave_id. is busy and cannot be assigned job;

        %if &slave_id. < 2  %then
            %let slave_id = %eval(&slave_id. + 1);
        %else 
            %let slave_id = 1;
    %end;

    %put Slave&slave_id. is free and is assigned job;

    %syslput _user_ /remote= slave&slave_id.;

    rsubmit slave&slave_id. macvar=slave&slave_id. wait=no;


        data _null_;

            file print;
            put "&value. by &slave_id.!";

        run;

    endrsubmit;

%mend job;

signon slave1 macvar=slave1;
signon slave2 macvar=slave2;

%job(6);

%job(7);

%job(8);

signoff slave1;
signoff slave2;
options sascmd=“!sascmd”;
%宏观工作(价值);
%本地奴隶身份证;
%设从机_id=1;
%执行%while(&&slave&slave_id.);
%put Slave&Slave_id.正忙,无法分配作业;
%如果从属id小于2%,则(&U)
%让从机id=%eval(&从机id.+1);
%否则
%设从机_id=1;
%结束;
%放置从机和从机id。是自由的,并且已分配任务;
%syslput\u user\u/remote=从机和从机id。;
rsubmit slave&slave\u id.macvar=slave&slave\u id.wait=否;
数据为空;
文件打印;
放置“&value.by&slave_id.!”;
跑
endrsubmit;
%修补工作;
signon slave1 macvar=slave1;
signon slave2 macvar=slave2;
%工作(6);
%工作(7);
%工作(8);
签核奴隶1;
签核奴隶2;
考虑一下: 我在signon上使用cmacvar选项为远程会话状态指定一个本地宏变量。 在syslput中,我在两个从机上创建了远程my_id宏变量,以便它们知道“他们是谁”

然后我有%job宏接收从机的ID来运行一些代码。对于真实世界,还应该有一些要运行的作业参数。在这里,我只是模拟较短的job1和较长的job2

在%run_作业中,我做了一些循环,尝试运行奴隶几次。 要点是在
WAITFOR\u ANY
语句中执行等待您的操作

signon slave1 sascmd="!sascmd" cmacvar=slave1; 
signon slave2 sascmd="!sascmd" cmacvar=slave2; 

%syslput my_id=1 /remote=slave1;
%syslput my_id=2 /remote=slave2;

rsubmit slave1;
options nomprint nosource nonotes;
endrsubmit;
rsubmit slave2;
options nomprint nosource nonotes;
endrsubmit;
/*
my_id is remote
slave_id is local
*/;
%macro job(slave_id);
rsubmit slave&slave_id. wait=no;
    data _null_;
         %if &slave_id eq 2 %then %do;
            x = sleep(2);
         %end;
         x = sleep(4);
         s = put(DATETIME(), DATETIME.) || " at &my_id.!";
        putlog s;
    run;
endrsubmit;
%mend;


%macro run_jobs;
    %do i=1 %to 4;
        %if &slave1 eq 0 %then %do;
            %put Slave1 starting;
            %job(1)
        %end;
        %else %put Slave1 working;
        %if &slave2 eq 0 %then %do;
            %put Slave2 starting;
            %job(2)
            %put Slave2: &slave2;
        %end;
        %else %put Slave2 working;
        WAITFOR _any_ slave1 slave2;
        *LISTTASK _ALL_ ;
        %put at end of loop &i:;
        %put Slave1: &slave1;
        %put Slave2: &slave2;
    %end;
%mend;


options nomprint nosource nonotes;
%run_jobs

signoff slave1;
signoff slave2;

你的
%do%while
循环将不必要地消耗相当多的CPU-我建议你在那里睡觉。是的,或者在第一次搜索从机结束时“等待任何”。我需要测试一下。这不是专门为waitfor\u any设计的吗?即使有waitfor any,我们仍然存在确定哪些奴隶是自由的并将工作分配给特定奴隶的问题。这是问题的症结所在。我发现的解决方案,也是vasja推荐的,是为cmacvar建立一些命名约定。这真的不理想。在OpenMP C++或其他方面,你需要做的就是说“动态调度”,它都会为你正确处理。我不知道为什么这没有在SAS中实现。我需要在周一得到SAS后尝试一下!