On 10/22/2015 07:23 AM, Nathan Sidwell wrote: > On 10/22/15 10:05, Jakub Jelinek wrote: >> On Thu, Oct 22, 2015 at 09:53:46AM -0400, Nathan Sidwell wrote: >>> On 10/22/15 05:37, Jakub Jelinek wrote: >>> >>>> And, I must say I'm at least missing testcases that check parsing >>>> but also >>>> runtime behavior of the vector or worker clause arguments (there >>>> is one gang (static:1) clause, but not the other clauses nor other >>>> styles of >>>> gang arguments. >>> >>> the static clause is only valid on gang. >> >> That is what I've figured out. >> But it is unclear from the parsing what from these is allowed: > > good questions. As you may have guessed, I'm not the primary author of > the parsing code. Cesar's stepped up to address this.
I'll go into more detail later when I post the revised patch, but for the time being, in response to your to your earlier question I've inlined how the clauses should be translated in comments below: > But it is unclear from the parsing what from these is allowed: int v, w; ... gang(26) // equivalent to gang(num:26) gang(v) // gang(num:v) vector(length: 16) // vector(length: 16) vector(length: v) // vector(length: v) vector(16) // vector(length: 16) vector(v) // vector(length: v) worker(num: 16) // worker(num: 16) worker(num: v) // worker(num: 16) worker(16) // worker(num: 16) worker(v) // worker(num: 16) gang(16, 24) // technically gang(num:16, num:24) is acceptable but it // should be an error gang(v, w) // likewise gang(static: 16, num: 5) // gang(static: 16, num: 5) gang(static: v, num: w) // gang(static: v, num: w) gang(num: 5, static: 4) // gang(num: 5, static: 4) gang(num: v, static: w) // gang(num: v, static: w) Also note that the static argument can accept '*'. > and if the length: or num: part is really optional, then > int length, num; > vector(length) > worker(num) > gang(num, static: 6) > gang(static: 5, num) > should be also accepted (or subset thereof?). Interesting question. The spec is unclear. It defines gang, worker and vector as follows in section 2.7 in the OpenACC 2.0a spec: gang [( gang-arg-list )] worker [( [num:] int-expr )] vector [( [length:] int-expr )] where gang-arg is one of: [num:] int-expr static: size-expr and gang-arg-list may have at most one num and one static argument, and where size-expr is one of: * int-expr So I've interpreted that as a requirement that length and num must be followed by an int-expr, whatever that is. I've been meaning to cleanup to up the c and c++ front ends for a while now, but I've been bogged down by other things. This is next on my todo list. Cesar