Hi Harald,

<snipp>

> > Did that help?  
> 
> Actually this discussion is quite helpful to me, so I (and maybe
> others) understand more of the underlying stuff.
> 
> I now spent some time looking thru portions of the F2023 standard,
> and I think that it answers many questions in that respect:
> 
> - 10.2 Assignment, esp. 10.2.1.3 Interpretation of intrinsic
> assignments
> 
> - 11.1.3 ASSOCIATE construct
> 
> - Transformational intrinsics: this_image, team_number, ...
> 
> It seems to be clear in most cases on which image something is
> evaluated, and which order.
> 
> > I mean, we are way off of the original question, which was if it
> > is ok to always compute a function result on the image initiating a
> > communication instead of in the caf_accessor.  
> 
> I am still confused what you mean by "initiating a communication".

When you use OpenCoarrays and a Coindex gets executed a communication
is triggered.

> The function you are talking about takes an argument, interpreted
> in the way defined by the standard, and each image evalutes its
> portion.

That is what I confused. I had the dumb idea to evaluate certain
functions not on the calling image, but on the remote one. (Again,
OpenCoarrays triggers a communication, when the coindex points to an
image different from this_image()). My last patch remedies this.
Function calls in an expression having a coindex are now always
evaluated on the calling image. 

> In code such as
> 
> > if (this_image() == 1) caf(:, team_number(row_team))[1, team_number
> > = -1] = row    
> 
> team_number is a transformational function, which I expect to get
> evaluated on each image where the condition is fulfilled.  I don't
> see any communication involved.

Well, the expression caf(...)[1, team_number=-1] when this_image() /= 1
triggers a communication. The program is writing into "remote" memory
here. I.e. memory that belongs to image 1 in the initial team. When
this code is executed by image 1 of the row_team, which maps to image 4
in the initial team (just for simplicity; it may map to a different one,
but let's assume it is mapped linear here), then a portion of the caf
array in the initial team of image 1 is updated. When using
OpenCoarrays, this means that a message is composed, send to the remote
image's communication thread, executed there and a result is returned
indicating completion. This is where the communication is involved.
GFortran creates an accessor routine for writing data into `caf(:,
add_data%team_number_row_team) = data`. This routine is executed by the
communication thread on the remote image. My latest patch now corrects,
that `add_data%team_number_row_team` is correctly used instead of
`current_team(add_data%row_team)`. The latter can not be executed in
the communication thread, because `row_team` is a pointer into memory
of the calling image. 

Yes, I know. All of this confusing and it also took me a longer time to
understand all of this and figure a way to do this fast and efficient.

> Then there is the assignment, which is difficult.  I haven't thought
> long enough about the consistency between the condition which refers
> to the current team, and coindex 1 of the initial team.
> (This is why I asked about communicators and alike, as this assignment
> might be correct only under very special conditions, or I just don't
> understand it.)

To my understanding that assignment is allowed by the standard. Any
concerns?

> So can you clarify that your code evaluates in the standard-defined
> way?

I hope the above did it.

Regards,
        Andre

-- 
Andre Vehreschild * Email: vehre ad gmx dot de 

Reply via email to