Graph Partitioning with Acyclicity Constraints

Graph Partitioning with Acyclicity Constraints1 Practical Motivation目标平台: 用于高级成像和计算机视觉的异构多处理器,目前用于英特尔处理器,为低功耗和小内存设计。为了解决内存限制,将图划分为几个分区依次执行。这种划分的质量对通信量和性能有很大影响。现有很多启发式算法可以将图划分成节点数量大致相等的分区。但是我们的平台要求分区之间的依赖不能成环,因为要依次执行。2 Background把DAG的节点映射到异构嵌入式多处理器
摘要由CSDN通过智能技术生成

Graph Partitioning with Acyclicity Constraints

1 Practical Motivation

  • 目标平台: 用于高级成像和计算机视觉的异构多处理器,目前用于英特尔处理器,为低功耗和小内存设计。
  • 为了解决内存限制,将图划分为几个分区依次执行。这种划分的质量对通信量和性能有很大影响。
  • 现有很多启发式算法可以将图划分成节点数量大致相等的分区。但是我们的平台要求分区之间的依赖不能成环,因为要依次执行。

2 Background

  • 把DAG的节点映射到异构嵌入式多处理器的PE(processing element)时产生了图划分问题。
  • 平台的PE拥有私有的本地数据存储器和独立的程序存储器。 直接存储器访问控制器用于在本地存储器和系统的外部DDR存储器之间传输数据。 数据存储器的大小约为几百千字节,只能存储一小部分图像。因此,输入图像被分成小片。 该硬件的操作模式通常是应用程序图中的节点被分配给PE并一个接一个地处理这些分区。 在大多数情况下,这可以流水线化,使得当PE处理当前分区时,直接存储器访问控制器同时将下一分区加载到本地存储器并将处理后的分区从先前的迭代写回主存储器。

3 Prelimitaries

  • 平衡约束:

  • 无环约束:分区之间不能有循环的依赖关系

  • 目标函数:

  • DGPAQ (directed graph partitioning problem with acyclic quotient graph) 可以定义为找到一个分割,在满足平衡约束和无环约束的条件下,使目标函数最小。

  • 平衡约束确保调度组中的程序的大小不超过平台的程序存储器大小。减少边缘切割减少了组之间的数据传输量,从而减轻了应用程序的内存带宽要求。请注意,应用程序要么是计算限制的(处理器总是占用),要么是带宽限制的(处理器等待数据)。因此,最小化传输并不能保证最佳的调度。但是,特别是在嵌入式系统中,内存带宽通常是瓶颈,需要大量传输的调度既不会产生良好的吞吐量,也不会产生良好的能效。因此,我们解决了在给定约束下单独最小化边缘切割的问题,但没有解决调度问题。我们提供线性时间启发式算法,以后可以在更广泛的调度算法中用作子程序以减少数据传输。

4 Hardness Results

  • 当限定 k = 2,epsilon = 0 时,这个问题是NP完全问题,而且 k >=3 时,难以用有限近似因子近似。通过构造商图Q,检查平衡约束并检查Q的无环性,可以在线性时间内验证DGPAQ实例的给定解。最后一项任务可以使用Kahn算法在Q的大小的线性时间内完成。 我们现在将子集和问题归约为我们的问题。 最平衡的最小割问题是NP完全的。
  • 定理一 :epsilon = 0 时的二分情况下,DGPAQ问题是NP完全的。
  • 定理二 :epsilon = 0,k >= 3 时, DGPAQ没有多项式时间的近似算法,除非 P = NP。

5 Heuristic Algorithms

本节提出简单但高效的构造和局部搜索启发式算法来解决问题。大致方法是:现基于输入图的拓扑排序创造一个初始解,然后在保证两个约束的同时,利用局部搜索策略来改进解的目标。

Construction Algorithm

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Graph Partitioning是一个经典的图论问题,其目标是将一个大的图分割成若干个小的子图,使得每个子图尽可能地均衡,并且子图之间的边尽可能地少。这个问题在实际应用中非常常见,比如在计算机网络、分布式计算、图形处理等领域都有广泛的应用。 下面是一个简单的Graph Partitioning的代码示例,使用了Kernighan-Lin算法: ```python import numpy as np def graph_partitioning(adj_matrix, num_partitions): """ adj_matrix: 邻接矩阵 num_partitions: 分割成多少个子图 """ n = adj_matrix.shape[0] partitions = np.zeros(n, dtype=int) partition_size = n // num_partitions # 初始化每个顶点所属的初始分组 for i in range(n): partitions[i] = i // partition_size # 计算每个顶点与各个分组之间的边权重 weights = np.zeros((n, num_partitions)) for i in range(n): for j in range(num_partitions): weights[i, j] = np.sum(adj_matrix[i, partitions == j]) # 迭代优化每个分组内部的顶点分配 for iter in range(100): for i in range(n): group = partitions[i] gains = np.zeros(num_partitions) for j in range(num_partitions): if j == group: gains[j] = -np.sum(adj_matrix[i, partitions == j]) + np.sum(adj_matrix[i, partitions != j]) else: gains[j] = np.sum(adj_matrix[i, partitions == j]) - np.sum(adj_matrix[i, partitions != j]) best_group = np.argmax(gains) if best_group != group: partitions[i] = best_group # 计算当前的划分质量 quality = np.zeros(num_partitions) for j in range(num_partitions): quality[j] = np.sum(weights[:, j][partitions == j]) - np.sum(weights[:, j][partitions != j]) print(f"Iteration {iter+1}: partition quality = {np.min(quality)}") return partitions ``` 这里的邻接矩阵是一个二维的numpy数组,表示图中每个节点之间的连接关系,其中`adj_matrix[i, j]`表示节点i和节点j之间是否有一条边。`num_partitions`表示要将图分割成多少个子图。函数的返回值是一个一维的numpy数组,表示每个节点所属的子图编号(从0开始)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值