Guest User

Untitled

a guest
Aug 21st, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. from pprint import pprint
  2. import typing
  3. import enum
  4. import cvxpy as cvx
  5. from cvxpy import *
  6. #from cvxpy import Minimize
  7. import operator
  8. from functools import reduce
  9. import numpy as np
  10. from texttable import Texttable
  11. from collections import defaultdict
  12.  
  13. # Create two scalar optimization variables.
  14. constraints = []
  15.  
  16. tasks = 2
  17.  
  18. @enum.unique
  19. class WorkloadClass(enum.Enum):
  20. LowLatency = enum.auto()
  21. Opportunistic = enum.auto()
  22.  
  23.  
  24. class CPU(typing.NamedTuple):
  25. core_id: int
  26. package_id: int
  27. thread_id: int
  28.  
  29. class Workload(typing.NamedTuple):
  30. core_count: int
  31. workload_class: WorkloadClass = WorkloadClass.LowLatency
  32.  
  33. class Objective(typing.NamedTuple):
  34. objective: typing.Union[Minimize, Maximize]
  35. priority: int
  36. target: int
  37.  
  38.  
  39. cores = [
  40. CPU(0, 0, 0),
  41. CPU(1, 0, 0),
  42. CPU(2, 0, 1),
  43. CPU(3, 0, 1),
  44. CPU(4, 0, 2),
  45. CPU(5, 0, 2),
  46. CPU(6, 0, 3),
  47. CPU(7, 0, 3),
  48. CPU(8, 1, 4),
  49. CPU(9, 1, 4),
  50. CPU(10, 1, 5),
  51. CPU(11, 1, 5),
  52. CPU(12, 1, 6),
  53. CPU(13, 1, 6),
  54. CPU(14, 1, 7),
  55. CPU(15, 1, 7)
  56. ]
  57.  
  58. cores_by_thread = defaultdict(list)
  59. cores_by_package = defaultdict(list)
  60. for i in cores:
  61. cores_by_thread[i.thread_id].append(i)
  62.  
  63. for i in cores:
  64. cores_by_package[i.package_id].append(i)
  65.  
  66. print(cores_by_thread)
  67. print(cores_by_package)
  68.  
  69. workloads = [
  70. Workload(2),
  71. Workload(3),
  72. Workload(6)
  73. ]
  74.  
  75.  
  76. # 2 tasks, up to 8 cores per task
  77. assignments = cvx.Variable((len(workloads), len(cores)), boolean=True)
  78. constraints = []
  79. objectives = []
  80.  
  81. for core_assignments in cvx.atoms.affine.transpose.transpose(assignments):
  82. # It's priority 10000 to try to avoid scheduling multiple workloads on a single core
  83. objectives.append(Objective(Minimize(cvx.sum(core_assignments)), 10, 1))
  84.  
  85. for idx, workload in enumerate(workloads):
  86. constraints.append(cvx.sum(assignments[idx]) == workload.core_count)
  87.  
  88. # Now we try to make sure tha a given workload tries to stay on one package, then hyperthead
  89. #for assignment in assignments:
  90. for assignment in assignments:
  91. packages = []
  92. for _, package_cores in cores_by_package.items():
  93. packages.append(cvx.maximum(*[assignment[core.core_id] for core in package_cores]))
  94. objectives.append(Objective(Minimize(reduce(operator.add, packages)), 9, 1))
  95.  
  96.  
  97. for assignment in assignments:
  98. threads = []
  99. for _, package_threads in cores_by_thread.items():
  100. threads.append(cvx.maximum(*[assignment[core.thread_id] for core in package_threads]))
  101. objectives.append(Objective(Minimize(reduce(operator.add, threads)), 8, 1))
  102.  
  103.  
  104. #objective = cvx.transforms.scalarize.targets_and_priorities(*zip(*[(i.objective, i.priority, i.target) for i in objectives]))
  105. objective = cvx.transforms.scalarize.targets_and_priorities(*zip(*[(i.objective, i.priority, i.target) for i in objectives]))
  106. prob = cvx.Problem(objective, constraints)
  107. print(prob.solve())
  108. print(prob.status)
  109. print(prob.value)
  110. print(assignments.value)
  111. #print(np.clip(assignments.value, 0, 1))
  112. result = np.round(assignments.value).astype(int)
  113.  
  114. table = Texttable()
  115. labels = ["Cores", "Package", "Thread"] + ["Task {}".format(task_num) for task_num in range(result.shape[0])]
  116. table.add_row(labels)
  117.  
  118. print(cores)
  119. for core_num, i in enumerate(result.transpose()):
  120. print(core_num)
  121. c = cores[core_num]
  122. table.add_row(['core {}'.format(c.core_id), 'package_id {}'.format(c.package_id), 'thread_id {}'.format(c.thread_id)] + list(i))
  123. print(table.draw())
Add Comment
Please, Sign In to add comment