<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span></span><span>Hello, Phil,<br>
</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<div><br>
</div>
<div>Thank you for your excellent question.  The current Argobots does not provide a very straightforward way.<br>
</div>
<div><br>
</div>
<div>1. The simplest idea<br>
</div>
<div><br>
</div>
<div>In my opinion, the easiest way should be one that uses two pools, new-thread-pool and old-thread-pool.<br>
</div>
<div>The new threads/tasklets are pushed to one of new-thread-pools.  The user-defined scheduler looks like following:<br>
</div>
<div><br>
</div>
<div>sched_run():<br>
</div>
<div>  while (1) {<br>
</div>
<div>    if (unit = ABT_pool_pop(old_thread_pool)) {<br>
</div>
<div>      /* Prioritize resumed/yielded threads */<br>
</div>
<div>      ABT_xstream_run_unit(unit, old_thread_pool);<br>
</div>
<div>      continue;<br>
</div>
<div>    }<br>
</div>
<div>    if (unit = ABT_pool_pop(new_thread_pool)) {<br>
</div>
<div>      ABT_unit_set_associated_pool(unit, old_thread_pool);<br>
</div>
<div>      /* Threads are moved to old_thread_pool, so if this "unit" suspends or yields, it is<br>
</div>
<div>       * pushed to old_thread_pool, which will be prioritized over new threads. */<br>
</div>
<div>      ABT_xstream_run_unit(unit, old_thread_pool);<br>
</div>
<div>    }<br>
</div>
<div>  }<br>
</div>
<div><br>
</div>
<div>However, this scheduler may cause a deadlock with a certain dependency.  For example, thread2 is never scheduled forever since thread1 is in old_thread_pool.<br>
</div>
<div><br>
</div>
<div>g_flag = 0;<br>
</div>
<div>void thread1() {<br>
</div>
<div>  ABT_thread_create(thread2, ... new_thread_pool); /* newly created thread is pushed to new_thread_pool */<br>
</div>
<div>  while (g_flag == 0)<br>
</div>
<div>    ABT_thread_yield(); /* thread1 was associated with old_thread_pool when thread1 was scheduled for the first time. */<br>
</div>
<div>}<br>
</div>
<div>void thread2() {<br>
</div>
<div>  g_flag = 1;<br>
</div>
<div>}<br>
</div>
<div><br>
</div>
<div>To avoid this, the scheduler can sometimes check and run threads in new_thread_pool (for example, every N iterations).<br>
</div>
<div><br>
</div>
<div><br>
</div>
<div>2. Does it work with ABT_pool_pop_timedwait() (i.e., ABT_POOL_FIFO_WAIT)?<br>
</div>
<div><br>
</div>
<div>ABT_pool_pop_timedwait() only takes a single pool; users cannot timed-wait for multiple pools.  Consider using ABT_pool_pop_timedwait() instead of ABT_pool_pop() in the scheduler I mentioned above.  In general, a scheduler can timed-wait (= sleep) for
<span style="font-family: Calibri, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255); display: inline !important">
either old_thread_pool or new_thread_pool</span> even though the other pool has threads.  If there is application-specific knowledge (e.g., old_thread_pool can be empty only when new_thread_pool is empty etc), ABT_pool_pop_timedwait() + the scheduling strategy
 above is a good idea, though.<br>
</div>
<div><br>
</div>
<div>For now, there is no general solution.  One idea is using more execution streams: some ESs are dedicated to new-thread-pool while the other ESs to old-thread-pool.  If they sleep in ABT_pool_pop_timedwait(), the performance penalty of oversubscription
 etc should be small.<br>
</div>
<div><br>
</div>
<div>Creating a customized pool is another way (e.g., marking a thread when it is scheduled for the first time and manages newly created threads and suspend threads separately in a pool), but it is complicated.<br>
</div>
<div><br>
</div>
<div>The fundamental solution should be allowing different pool operations corresponding to yield/create/suspend/... (e.g., push to the head of the list on creation but pushed to the tail of the list on suspension: https://github.com/pmodels/argobots/issues/154),
 but it is under development.  If this option is the most promising, I will prioritize this.<br>
</div>
<div><br>
</div>
<div>If you have any questions, please let us know.<br>
</div>
<div><br>
</div>
<div>Thanks,<br>
</div>
<div>Shintaro<br>
</div>
<span></span><span></span><br>
</div>
<div id="appendonsend"></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Carns, Philip H. via discuss <discuss@lists.argobots.org><br>
<b>Sent:</b> Tuesday, July 7, 2020 4:40 PM<br>
<b>To:</b> discuss@lists.argobots.org <discuss@lists.argobots.org><br>
<b>Cc:</b> Carns, Philip H. <carns@mcs.anl.gov><br>
<b>Subject:</b> [argobots-discuss] scheduling with priority for resumed ULTs</font>
<div> </div>
</div>
<div dir="ltr">
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
Hi all,</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
I thought this question may be of general interest so I am asking on the mailing list.</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
My understanding is that the default pool/scheduler combination uses FIFO ordering.  Suppose we wanted to try a slight variation: FIFO ordering, but with resumed ULTs always taking priority over new ULTs that have not yet begun execution.<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
The use case for this would be for a data service to expedite requests that are already in progress (and were suspended while waiting on disk or network activity) to try to get them out of the system before starting to process new requests, assuming that there
 is work available in either category.  We create a new ULT for every incoming request.  Under heavy client process load it is plausible that the final step(s) of servicing an existing request could be delayed behind newly incoming requests, but we haven't
 empirically confirmed yet.<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
What would be the easiest way to accomplish this?  I think I can find a way to do it, but it probably would not be the cleverest solution
<span id="x_🙂">🙂</span><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
FWIW we usually use ABT_POOL_FIFO_WAIT and ABT_SCHED_BASIC_WAIT rather than the default pool and scheduler, but I don't think that should change anything.  They are based on the default pool and scheduler and only differ in terms of their idle behavior.</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
thanks!</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
-Phil<br>
</div>
</div>
</body>
</html>