【8086汇编】条件转移指令应用 jxxx

1.定义

在这里插入图片描述

2.应用示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

编写一个python程序,根据读入的excel数据,建立一个DAG excel数据格式如下: JobTypeID JobID Kernel名字 Job负载 JobPL2大小 搬入长度 搬出长度 搬入SL2长度 搬入DDR长度 搬出SL2长度 搬出DDR长度 PublishJob Qos Signal J481 0 MNGFRM_DEV_KERNEL_ID_PREPROC 13810 520 500 0 0 500 0 0 J176 11 -3 J481 0 MNGFRM_DEV_KERNEL_ID_PREPROC 13810 520 500 0 0 500 0 0 J176 11 -3 J176 2 PUSCH_DEV_KERNEL_MNGPUSCHPROC 114292 42744 40468 27844 38344 2124 16 27828 J240 9 -2.5 J176 2 PUSCH_DEV_KERNEL_MNGPUSCHPROC 114292 42744 40468 27844 38344 2124 16 27828 J240 9 -2.5 J240 4 PUSCH_DEV_KERNEL_USER_MERGE 13383 31504 31476 27844 11092 20384 16 27828 J178 8 J240 4 PUSCH_DEV_KERNEL_USER_MERGE 13383 31504 31476 27844 11092 20384 16 27828 J178 8 J178 6 PUSCH_DEV_KERNEL_PARAGEN_PUSCH 26330 26320 20536 8324 84 20452 84 8240 J247 7 J178 6 PUSCH_DEV_KERNEL_PARAGEN_PUSCH 26330 26320 20536 8324 84 20452 84 8240 J247 7 J247 8 PUSCH_DEV_KERNEL_USERGRP_SLICE_PREPROC 28069 38848 38848 0 38448 400 0 0 J241 15 -0.5 J241 9 PUSCH_DEV_KERNEL_USERGRP_SLICE 35323 36212 35684 0 35284 400 0 0 J252 15 J252 10 PUSCH_DEV_KERNEL_TRIG_USERGRP_PARAGEN 21643 8 0 0 0 0 0 0 J242 10 J242 11 PUSCH_DEV_KERNEL_USERGRP_PARAGEN 53977 33444 15464 13236 200 15264 13236 0 J187 10 J481为第一个任务,依赖关系根据PublishJob所在的列中的JXXX来建立。 self.id = id #JobTypeID self.load = load # Job负载 self.pre_mem = pre_mem # 搬入长度 self.post_mem = post_mem # 搬出长度 self.s_alloc = s_alloc # 分配的共享内存 self.s_free = s_free # 释放的共享内存 self.succ_list = list # 根据PublishJob建立
03-08
<think>好的,我现在需要帮用户编写一个Python程序,根据Excel数据建立DAG(有向无环图)。首先,我需要理解用户的需求和数据格式。 用户提供的Excel表格包含多个列,其中关键列是JobTypeID、PublishJob等。根据描述,每个任务的依赖关系由PublishJob列中的JXXX决定。例如,J481的PublishJob是J176,所以J176应该是J481的后继任务,或者说J481依赖J176?或者反过来?这里可能需要仔细确认。通常,依赖关系是指当前任务完成后发布的下一个任务,所以可能需要将PublishJob作为当前任务的后继。比如,J481的PublishJob是J176,那么J176应该在J481执行完后执行,即J481指向J176。但需要确认用户的需求,这里可能需要再仔细看例子。 另外,用户提供的示例数据中,J481的PublishJob是J176,而J176的PublishJob是J240,依此推。这样形成的链式结构应该是J481 → J176 → J240 → J178 → J247 → J241 → J252 → J242 → J187等。因此,每个任务的succ_list应该包含它的PublishJob对应的任务。 接下来,需要确定如何表示DAG中的节点。根据用户提供的属性,每个节点应有id、load、pre_mem、post_mem、s_alloc、s_free以及succ_list。不过,用户提到的属性中,s_alloc和s_free可能需要从数据中的某些列提取,比如搬入SL2长度、搬出SL2长度等,可能需要进一步确认数据列对应的字段。 数据列包括:搬入长度、搬出长度、搬入SL2长度、搬入DDR长度、搬出SL2长度、搬出DDR长度。根据用户定义的属性,pre_mem对应搬入长度,post_mem对应搬出长度。s_alloc可能是搬入SL2长度和搬入DDR长度的总和?或者可能s_alloc是分配的共享内存,对应搬入SL2长度,而s_free是释放的共享内存,对应搬出SL2长度?这点需要明确。例如,用户定义的s_alloc是分配的共享内存,可能对应搬入SL2长度,而s_free是释放的共享内存,对应搬出SL2长度。或者可能其他列?需要根据用户给出的属性定义来对应。 根据用户给出的属性列表: self.pre_mem = pre_mem # 搬入长度 → 对应“搬入长度”列 self.post_mem = post_mem # 搬出长度 → 对应“搬出长度”列 self.s_alloc = s_alloc # 分配的共享内存 → 可能对应“搬入SL2长度”? self.s_free = s_free # 释放的共享内存 → 可能对应“搬出SL2长度”? 例如,数据中的某行有搬入SL2长度为0,搬入DDR长度为500,可能s_alloc是搬入SL2长度(比如0),或者是否还有其他处理?可能需要用户进一步说明,但根据现有信息,可能需要将s_alloc对应搬入SL2长度,s_free对应搬出SL2长度。或者可能s_alloc是搬入SL2长度和搬入DDR长度的总和?需要看用户需求。但根据属性名称,s_alloc可能是分配的共享内存,而共享内存可能对应SL2部分,而DDR可能属于其他型的内存。因此,可能s_alloc是搬入SL2长度,而搬入DDR长度可能属于其他内存型,不被包含在s_alloc中。所以这里可能需要将s_alloc设为搬入SL2长度,s_free设为搬出SL2长度。 接下来,如何读取Excel数据。使用Python的话,可以用pandas库读取Excel文件。然后按JobTypeID分组,因为可能存在多个相同JobTypeID的行,但需要合并为一个节点?或者是否每个JobID都是唯一的?例如,示例数据中,J481有JobID为0的两行,可能这两行是同一个任务的不同Kernel?但根据用户的需求,可能需要将相同JobTypeID的任务视为同一个节点,并可能需要合并某些属性,或者取第一个出现的值?或者是否每个JobID是唯一的,但示例中的JobID可能有重复?例如,J481的JobID都是0,而J176的JobID是2,这可能表示每个JobTypeID对应的JobID是唯一的?或者JobTypeID是任务型,而JobID是实例ID?但用户提到“self.id = id #JobTypeID”,所以每个节点的id是JobTypeID,因此同一JobTypeID的行应该合并为一个节点。但需要处理重复的JobTypeID行,例如前两行都是J481,可能需要将这些行的数据合并,或者取其中一行,因为其他列可能相同? 观察示例数据,相同JobTypeID的行的各列数据似乎完全相同,比如前两行J481的所有数据都相同。因此,可能在读取时去重,每个JobTypeID只保留一个节点。因此,在读取数据时,可以按JobTypeID分组,取第一个出现的行数据,或者合并重复项。 接下来,建立DAG的结构。每个节点的succ_list是它的PublishJob对应的JobTypeID。例如,J481的PublishJob是J176,因此J481的succ_list应包含J176,同时J176的succ_list包含J240,依此推。需要注意可能存在多个PublishJob的情况,但根据示例数据,每个任务的PublishJob列只有一个值,或者为空。例如,最后一行J242的PublishJob是J187,但示例数据中可能没有J187的数据,因此可能需要处理这种情况,即某些PublishJob对应的节点不存在于数据中,是否要忽略,还是作为孤立节点? 对于DAG的构建,可能需要将所有出现的JobTypeID作为节点,然后根据PublishJob建立边。如果某个PublishJob的JobTypeID不存在于数据中,可能该节点不存在,导致边无法建立,或者需要创建该节点?但根据示例数据,可能需要假设所有PublishJob对应的JobTypeID都存在于数据中,否则可能存在数据不完整的情况。 现在,步骤大致如下: 1. 读取Excel文件,使用pandas读取。 2. 处理数据,按JobTypeID去重,每个JobTypeID对应一个节点。 3. 为每个JobTypeID创建节点对象,包含相关属性。 4. 根据每个节点的PublishJob列,建立succ_list,即当前节点的后继节点。 5. 构建整个DAG,确保没有循环。 可能的代码结构: - 使用pandas读取Excel,按JobTypeID去重。 - 创建一个字典,保存所有节点,键为JobTypeID,值为节点对象。 - 遍历每个节点,处理其PublishJob,将对应的JobTypeID添加到succ_list。 - 最后,确保所有节点连接正确,形成DAG。 需要注意的问题: - 如何处理重复的JobTypeID行:去重,保留第一个。 - PublishJob为空的情况:例如示例数据中J178的PublishJob是J247,而J247的PublishJob是J241,依此推,直到最后一行J242的PublishJob是J187,但数据中没有J187的行。此时,J242的succ_list会包含J187,但J187不存在于节点字典中,可能导致错误。是否需要创建该节点?或者忽略?需要根据用户需求判断。如果用户的数据可能包含这种情况,可能需要将不存在的PublishJob作为孤立节点处理,或者在构建时忽略。 假设用户的数据中所有PublishJob对应的JobTypeID都存在,或者允许存在指向不存在的节点,那么在代码中处理时,需要检查PublishJob是否存在,若存在则添加,否则可能忽略或报错。 现在,具体代码实现步骤: 1. 导入必要的库:pandas用于读取Excel,可能还需要一个节点。 2. 定义节点: class JobNode: def __init__(self, job_type_id, load, pre_mem, post_mem, s_alloc, s_free): self.id = job_type_id self.load = load self.pre_mem = pre_mem self.post_mem = post_mem self.s_alloc = s_alloc self.s_free = s_free self.succ_list = [] # 存储后继节点的JobTypeID或者节点对象 def add_succ(self, succ_id): self.succ_list.append(succ_id) 3. 读取Excel文件,去重: import pandas as pd df = pd.read_excel('data.xlsx') # 假设文件名为data.xlsx # 去重,保留每个JobTypeID的第一行 df_unique = df.drop_duplicates(subset=['JobTypeID'], keep='first') 4. 创建节点字典: nodes = {} for _, row in df_unique.iterrows(): job_type_id = row['JobTypeID'] load = row['Job负载'] pre_mem = row['搬入长度'] post_mem = row['搬出长度'] s_alloc = row['搬入SL2长度'] # 假设s_alloc对应搬入SL2长度 s_free = row['搬出SL2长度'] # 假设s_free对应搬出SL2长度 node = JobNode(job_type_id, load, pre_mem, post_mem, s_alloc, s_free) nodes[job_type_id] = node 5. 建立依赖关系: for _, row in df_unique.iterrows(): current_job = row['JobTypeID'] publish_job = row['PublishJob'] if pd.notna(publish_job) and publish_job in nodes: nodes[current_job].add_succ(publish_job) # 如果publish_job不在nodes中,可以选择忽略或处理 6. 验证DAG是否有环:可以使用拓扑排序等方法,但用户可能没有要求,所以暂时不处理。 7. 输出或使用DAG结构。 测试示例数据,例如J481的PublishJob是J176,所以在nodes['J481'].succ_list中应包含'J176',而nodes['J176'].succ_list包含'J240',依此推。 可能的问题: - 数据中的PublishJob是否可能有多个值?例如,某个任务的PublishJob列是否有多个JobTypeID?根据示例数据,每个PublishJob列只有一个值,所以假设每个任务只有一个后继。 - 是否需要处理Signal和Qos列?根据用户提供的属性,似乎没有用到这些列,所以可能不需要。 - 是否需要处理JobPL2大小、搬入DDR长度、搬出DDR长度等列?根据用户定义的属性,可能这些列未被使用,所以暂时忽略。 综上,代码的大致结构是这样。需要注意数据中的列名是否与代码中的列名一致,例如是否包含空格或不同的命名方式,比如“搬入SL2长度”在Excel中的列名是否与代码中的一致,可能需要调整列名。例如,在读取时,确保列名正确,可能需要处理中文列名或检查是否有空格。 例如,用户给出的数据列名可能包含空格,例如“Kernel名字”中间有空格,但在代码中应该用正确的列名。例如,在pandas中,列名应该与Excel中的完全一致,包括空格。例如: df.columns的输出可能为['JobTypeID', 'JobID', 'Kernel名字', 'Job负载', 'JobPL2大小', '搬入长度', '搬出长度', '搬入SL2长度', '搬入DDR长度', '搬出SL2长度', '搬出DDR长度', 'PublishJob', 'Qos', 'Signal'] 所以在代码中,需要确保列名正确,如row['PublishJob'],row['搬入SL2长度']等。 另外,在示例数据中,某些行的PublishJob可能为空,例如J178的PublishJob是J247,而J247的PublishJob是J241,依此推,直到J242的PublishJob是J187,但数据中没有J187的行。此时,J242的succ_list会添加J187,但J187不存在于nodes字典中。如何处理这种情况?可能需要忽略,或者在添加前检查是否存在。 在代码中,当处理publish_job时,使用if publish_job in nodes来判断,如果不存在则跳过。例如: publish_job = row['PublishJob'] if pd.notna(publish_job) and publish_job in nodes: nodes[current_job].add_succ(publish_job) 但需要注意,publish_job可能是一个字符串,如'J187',而nodes的键是字符串,所以比较是可行的。 但可能Excel中的PublishJob列中的值是否带有前后空格或其他问题,需要确保读取后的publish_job变量是正确的字符串。例如,在数据中,某些行的PublishJob可能包含空格,如' J176',这会导致判断失败。因此,在处理时可能需要去除空格: publish_job = str(row['PublishJob']).strip() 或者确保数据中的值正确。 另外,对于数值型的JobTypeID,例如如果JobTypeID是数字,但在示例中是字符串如'J481',所以在读取时应确保作为字符串处理。可能需要在读取Excel时指定dtype,例如: df = pd.read_excel('data.xlsx', dtype={'JobTypeID': str, 'PublishJob': str}) 这样可以避免将J481转换为其他型。 总结,代码的编写步骤如下: 1. 读取Excel数据,处理为每个JobTypeID唯一的节点。 2. 创建节点对象,填充属性。 3. 根据PublishJob建立后继关系。 4. 输出DAG结构或进行其他操作。 现在,编写完整的代码示例: 首先,安装必要的库: pip install pandas openpyxl 然后,代码: import pandas as pd class JobNode: def __init__(self, job_type_id, load, pre_mem, post_mem, s_alloc, s_free): self.id = job_type_id self.load = load self.pre_mem = pre_mem self.post_mem = post_mem self.s_alloc = s_alloc self.s_free = s_free self.succ_list = [] # 存储后继节点的JobTypeID def add_succ(self, succ_id): if succ_id not in self.succ_list: self.succ_list.append(succ_id) def __repr__(self): return f"JobNode({self.id}, succs: {self.succ_list})" # 读取Excel文件,假设文件名为jobs.xlsx df = pd.read_excel('jobs.xlsx', dtype={'JobTypeID': str, 'PublishJob': str}) # 去重,每个JobTypeID保留第一个出现的行 df_unique = df.drop_duplicates(subset=['JobTypeID'], keep='first') # 创建节点字典 nodes = {} for _, row in df_unique.iterrows(): job_type_id = row['JobTypeID'] # 提取所需属性 load = row['Job负载'] pre_mem = row['搬入长度'] post_mem = row['搬出长度'] s_alloc = row['搬入SL2长度'] s_free = row['搬出SL2长度'] # 创建节点 node = JobNode(job_type_id, load, pre_mem, post_mem, s_alloc, s_free) nodes[job_type_id] = node # 建立依赖关系 for _, row in df_unique.iterrows(): current_job = row['JobTypeID'] publish_job = row['PublishJob'] # 处理可能的NaN或空字符串 if pd.notna(publish_job) and isinstance(publish_job, str) and publish_job.strip() != '': publish_job = publish_job.strip() if publish_job in nodes: nodes[current_job].add_succ(publish_job) else: print(f"警告: {current_job} 的PublishJob {publish_job} 不存在于节点中") # 打印检查 for job_id, node in nodes.items(): print(f"节点 {job_id}: 后继 {node.succ_list}") # 此时,nodes字典中存储了所有节点及其依赖关系,构成DAG 可能的测试输出: 节点 J481: 后继 ['J176'] 节点 J176: 后继 ['J240'] 节点 J240: 后继 ['J178'] 节点 J178: 后继 ['J247'] 节点 J247: 后继 ['J241'] 节点 J241: 后继 ['J252'] 节点 J252: 后继 ['J242'] 节点 J242: 后继 ['J187'] 节点 J187: 后继 [] # 假设J187不存在于数据中,则不会有节点,但根据代码,如果J242的PublishJob是J187,但J187不在nodes中,会发出警告,并且不会添加到succ_list中? 但根据代码中的处理逻辑,只有当publish_job存在于nodes中时才会添加。所以如果J187不在nodes中,则不会添加到J242的succ_list中。例如,在示例数据中,J242的PublishJob是J187,但数据中没有J187的行,因此nodes中不会有J187,所以J242的succ_list不会添加J187,并打印警告。 因此,在代码中需要处理这种情况,用户可能需要注意数据完整性。 综上,这个程序可以构建一个DAG,其中每个节点代表一个任务,依赖关系由PublishJob列决定。用户可以根据需要进一步使用这个DAG结构,例如进行拓扑排序、任务调度等。</think>以下是逐步构建DAG的Python实现方案: ```python import pandas as pd class JobNode: def __init__(self, job_id, load, pre_mem, post_mem, s_alloc, s_free): self.id = job_id # 任务型ID self.load = load # 任务负载 self.pre_mem = pre_mem # 搬入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值