public inbox for cygwin-developers@cygwin.com
 help / color / mirror / Atom feed
From: Mark Geisert <mark@maxrnd.com>
To: cygwin-developers@cygwin.com
Subject: Re: Implement sched_[gs]etaffinity()
Date: Wed, 17 Apr 2019 04:31:00 -0000	[thread overview]
Message-ID: <Pine.BSF.4.63.1904162114260.43792@m0.truegem.net> (raw)
In-Reply-To: <20190416104512.GO3599@calimero.vinschen.de>

On Tue, 16 Apr 2019, Corinna Vinschen wrote:
> On Apr 16 01:19, Mark Geisert wrote:
>> (4) I was looking at Cygwin's fhandler_proc.cc, function
>> format_proc_cpuinfo().  There's a call to __get_cpus_per_group() which is
>> implemented in miscfuncs.cc.  I haven't seen in the MSDN docs whether each
>> processor group is guaranteed to have the same number of processors.  I
>> might even expect variations on a NUMA system.  Anybody know if one can
>> depend on the group membership of the first processor group to apply to all
>> groups?
>
> Maybe https://go.microsoft.com/fwlink/p/?linkid=147914 helps?
>
> "If the number of logical processors exceeds the maximum group size,
>  Windows creates multiple groups by splitting the node into n groups,
>  where the first n-1 groups have capacities that are equal to the group
>  size."

Great; thanks for that.

> We were over that already when creating the code in format_proc_cpuinfo.
> So, IIUC, , and IIRC, the idea is that the logical CPUs are split into
> equal chunks of logical CPUs, along NUMA node bordres on a NUMA system,
> and the last group has potentially, but seldomly, less nodes.
> in the end, the important thing is that all groups have equal size,
> except the last one.
>
> Therefore:
>
>  WORD cpu_group = cpu_number / num_cpu_per_group;
>  KAFFINITY cpu_mask = 1L << (cpu_number % num_cpu_per_group);
>
> That also means the transposition between the groupless linux system
> and the WIndows system is fairly easy.

Yes, dealing with an array of unsigned longs vs bitblt ops FTW.

>> (5) On Windows, a process starts out in a particular processor group.  One
>> can then change thread affinities in such a way that some threads run in a
>> different processor group than other threads of the same process.  The
>> process becomes a "multi-group" process.  This has implications for the
>> conversions discussed in (1).
>
> Don't see how.  Care to explain?

I was just whinging in advance that a single sched_get/setaffinity will 
result in multiple Windows affinity ops to gather/scatter among processor 
groups the process belongs to.  At least they won't be bitblt ops.

>> (6) On Linux, processor affinity is inherited across fork() and execve().
>> I'll need to ensure Cygwin's implementation of those calls handle affinity
>> the same way.
>
> Just passing the INHERIT_PARENT_AFFINITY flag to CreateProcess{AsUser}
> should do the trick.

OK.  Hope so.

(7), to make a prime number: I don't see any need for the Cygwin DLL to 
keep any affinity info (process or thread) or processor group membership 
info around, do you?  I believe the sched_get/setaffinity functions will 
do whatever Windows ops they need to do on the fly based on the args 
passed in.  That allows the user to do Windows affinity ops at will 
outside of Cygwin without screwing up any Cygwin-maintained context.

Thanks again,

..mark

  reply	other threads:[~2019-04-17  4:31 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-11  4:21 Mark Geisert
2019-04-11  8:26 ` Corinna Vinschen
2019-04-11  8:38   ` Corinna Vinschen
2019-04-11 20:52     ` Mark Geisert
2019-04-12  7:46       ` Corinna Vinschen
2019-04-16  8:19         ` Mark Geisert
2019-04-16 10:45           ` Corinna Vinschen
2019-04-17  4:31             ` Mark Geisert [this message]
2019-04-17  7:57               ` Corinna Vinschen
2019-04-26  8:44                 ` Mark Geisert
2019-04-26  8:53                   ` Corinna Vinschen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.BSF.4.63.1904162114260.43792@m0.truegem.net \
    --to=mark@maxrnd.com \
    --cc=cygwin-developers@cygwin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).