Hi Hui --
I believe that what you're seeing here is due to Chapel's injection of shadow
'const's for variables of simple types (like integers) when they cross from
their declared scope to a parallel scope. Specifically, by default, each task
will get its own 'const' copy of the variable to prevent accidental race
conditions. There's a short-and-sweet description of them in the 1.11 release
notes (http://chapel.cray.com/releaseNotes/1.11/01-LanguageCompiler.pdf) though
you can also read about them in the language specification and online
documentation ("task intents" and "forall intents" are keywords to look for).
To check this theory, I tried a few things with the 1.14 compiler such as
overriding the default intent for the coforall loop:
coforall loc in Locales with (ref gVar) {
and changing the type of gVar to a type that is passed to tasks by reference by
default (like an atomic variable). With either of those changes, the output
reported '0' every time as you expected.
Having said that, I want to caution that we've found ourselves running into a
few cases lately which have caused us to debate (a) whether the compiler's
doing "the right thing" and/or (b) what "the right thing" for a given case
should be. So while this case seemed to be behaving properly to me, if you run
into other cases that are surprising even taking task/forall intents into
account, please feel encouraged to report or ask about them.
It's interesting that you ask about a "locale private" mechanism in Chapel
(i.e., "don't permit remote locales to access this variable"), which could also
help the compiler by saying "I know that all references to this variable will
be local, so don't introduce any overhead to potentially communicate it if
you're uncertain." This is an idea that comes up fairly regularly, yet which
we have not yet pursued ourselves. I don't think it would be very hard to
implement, and I haven't heard anyone express outright opposition to it, but I
don't think we haven't had a compelling enough proposal or use case for it to
take it on ourselves yet. If you have ideas of how it should appear
syntactically and behave semantically, that would be interesting (and could be
the basis for a good CHIP). Interestingly, while this question gets asked a
lot, I'm not personally aware of many people who've gotten bitten by
accidentally modifying something remote that they weren't supposed to -- so if
you have war stories like that, we'd be interested to hear them.
Best wishes,
-Brad
Language and Compiler Improvements -
Chapel<http://chapel.cray.com/releaseNotes/1.11/01-LanguageCompiler.pdf>
chapel.cray.com
C O M P U T E | S T O R E | A N A LY Z E Language and Compiler Improvements
Chapel Team, Cray Inc. Chapel version 1.11 April 2, 2015
________________________________
From: Hui Zhang <[email protected]>
Sent: Monday, October 10, 2016 10:29:12 PM
To: Chapel Sourceforge Developers List
Subject: [Chapel-developers] variable's locale inquiry in parallel block
Hello,
I'm confused about the result of inquiring the variable's locale info inside a
parallel block:
code:
proc main() {
var gVar = 100;
coforall loc in Locales {
on loc {
writeln("Pos2: from
loc.id<http://loc.id>"+loc.id<http://loc.id>+", gVar="+gVar+",
gVar.loc="+gVar.locale.id<http://gVar.locale.id>);
}
}
}
output:
Pos2: from loc.id0, gVar=100, gVar.loc=0
Pos2: from loc.id2, gVar=100, gVar.loc=2
Pos2: from loc.id1, gVar=100, gVar.loc=1
Same results by using forall/begin/cobegin.
Variable gVar is defined in locale 0, if I use serial "for" instead of
"coforall", then the gVar.locale.id<http://gVar.locale.id> will all print "0",
which makes sense. However, why locale.id<http://locale.id> of the same
variable gVar is changed to be where it's accessed (loc.id<http://loc.id>) in
the parallel cases (while using coforall/forall/begin/cobegin) ???
Besides, since Chapel has this global view of variables no matter where they
are defined, it seems like a little dangerous to use because any locale can
easily modify the value of a variable that's defined in another locale if
someone happens to misuse variable names...Is there a locale-specific (like
private to the particular locale) variable mechanism that can prevent such
mistake in Chapel ?
Thanks !
Thanks
--
Best regards
Hui Zhang
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Chapel-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-developers