OpenACC¶
Todo
add OpenACC specifications and implement its grammar and syntax
Grammar¶
In this section, we give the BNF used grammar for parsing openacc.
// The following grammar is compatible with OpenACC 2.5
// TODO: - int-expr when needed (see specs)
// - use boolean condition for If
Openacc:
statements*=OpenaccStmt
;
OpenaccStmt: '#$' 'acc' stmt=AccConstructOrDirective;
////////////////////////////////////////////////////
// Constructs and Directives
////////////////////////////////////////////////////
AccConstructOrDirective:
AccParallelConstruct
| AccKernelsConstruct
| AccDataConstruct
| AccEnterDataDirective
| AccExitDataDirective
| AccHostDataDirective
| AccLoopConstruct
| AccAtomicConstruct
| AccDeclareDirective
| AccInitDirective
| AccShutDownDirective
| AccSetDirective
| AccUpdateDirective
| AccRoutineDirective
| AccWaitDirective
| AccEndClause
;
////////////////////////////////////////////////////
////////////////////////////////////////////////////
// Constructs and Directives definitions
////////////////////////////////////////////////////
AccAtomicConstruct: 'atomic' clauses*=AccAtomicClause;
AccDataConstruct: 'data' clauses*=AccDataClause;
AccDeclareDirective: 'declare' clauses*=AccDeclareClause;
AccEnterDataDirective: 'enter' 'data' clauses*=AccEnterDataClause;
AccExitDataDirective: 'exit' 'data' clauses*=AccExitDataClause;
AccHostDataDirective: 'host_data' clauses*=AccHostDataClause;
AccInitDirective: 'init' clauses*=AccInitClause;
AccKernelsConstruct: 'kernels' clauses*=AccKernelsClause;
AccLoopConstruct: 'loop' clauses*=AccLoopClause;
AccParallelConstruct: 'parallel' clauses*=AccParallelClause;
AccRoutineDirective: 'routine' clauses*=AccRoutineClause;
AccShutDownDirective: 'shutdown' clauses*=AccShutDownClause;
AccSetDirective: 'set' clauses*=AccSetClause;
AccUpdateDirective: 'update' clauses*=AccUpdateClause;
AccWaitDirective: 'wait' clauses*=AccWaitClause;
////////////////////////////////////////////////////
////////////////////////////////////////////////////
// Clauses for Constructs and Directives
////////////////////////////////////////////////////
AccParallelClause:
AccAsync
| AccWait
| AccNumGangs
| AccNumWorkers
| AccVectorLength
| AccDeviceType
| AccIf
| AccReduction
| AccCopy
| AccCopyin
| AccCopyout
| AccCreate
| AccPresent
| AccDevicePtr
| AccPrivate
| AccFirstPrivate
| AccDefault
;
AccKernelsClause:
AccAsync
| AccWait
| AccNumGangs
| AccNumWorkers
| AccVectorLength
| AccDeviceType
| AccIf
| AccCopy
| AccCopyin
| AccCopyout
| AccCreate
| AccPresent
| AccDevicePtr
| AccDefault
;
AccDataClause:
AccIf
| AccCopy
| AccCopyin
| AccCopyout
| AccCreate
| AccPresent
| AccDevicePtr
;
AccEnterDataClause:
AccIf
| AccAsync
| AccWait
| AccCopyin
| AccCreate
;
AccExitDataClause:
AccIf
| AccAsync
| AccWait
| AccCopyout
| AccDelete
| AccFinalize
;
AccHostDataClause: AccUseDevice;
AccLoopClause:
AccCollapse
| AccGang
| AccWorker
| AccVector
| AccSeq
| AccAuto
| AccTile
| AccDeviceType
| AccIndependent
| AccPrivate
| AccReduction
;
AccAtomicClause: AccAtomicStatus;
AccDeclareClause:
AccCopy
| AccCopyin
| AccCopyout
| AccCreate
| AccPresent
| AccDevicePtr
| AccDeviceResident
| AccLink
;
AccInitClause:
AccDeviceType
| AccDeviceNum
;
AccShutDownClause:
AccDeviceType
| AccDeviceNum
;
AccSetClause:
AccDefaultAsync
| AccDeviceNum
| AccDeviceType
;
AccUpdateClause:
AccAsync
| AccWait
| AccDeviceType
| AccIf
| AccIfPresent
| AccSelf
| AccHost
| AccDevice
;
AccRoutineClause:
AccGang
| AccWorker
| AccVector
| AccSeq
| AccBind
| AccDeviceType
| AccNoHost
;
AccWaitClause: AccAsync;
////////////////////////////////////////////////////
////////////////////////////////////////////////////
// Clauses definitions
////////////////////////////////////////////////////
AccAsync: 'async' '(' args+=ID[','] ')';
AccAuto: 'auto';
AccBind: 'bind' '(' arg=STRING ')';
AccCache: 'cache' '(' args+=ID[','] ')';
AccCollapse: 'collapse' '(' n=INT ')';
AccCopy: 'copy' '(' args+=ID[','] ')';
AccCopyin: 'copyin' '(' args+=ID[','] ')';
AccCopyout: 'copyout' '(' args+=ID[','] ')';
AccCreate: 'create' '(' args+=ID[','] ')';
AccDefault: 'default' '(' status=AccDefaultStatus ')';
AccDefaultAsync: 'default_async' '(' args+=ID[','] ')';
AccDelete: 'delete' '(' args+=ID[','] ')';
AccDevice: 'device' '(' args+=ID[','] ')';
AccDeviceNum: 'device_num' '(' n=INT ')';
AccDevicePtr: 'deviceptr' '(' args+=ID[','] ')';
AccDeviceResident: 'device_resident' '(' args+=ID[','] ')';
AccDeviceType: 'device_type' '(' args+=ID[','] ')';
AccFirstPrivate: 'firstprivate' '(' args+=ID[','] ')';
AccFinalize: 'finalize';
AccGang: 'gang' '(' args+=AccGangArg[','] ')';
AccHost: 'host' '(' args+=ID[','] ')';
AccIf: 'if' cond=ID;
AccIfPresent: 'if_present';
AccIndependent: 'independent';
AccLink: 'link' '(' args+=ID[','] ')';
AccNoHost: 'nohost';
AccNumGangs: 'num_gangs' '(' n=INT ')';
AccNumWorkers: 'num_workers' '(' n=INT ')';
AccPresent: 'present' '(' args+=ID[','] ')';
AccPrivate: 'private' '(' args+=ID[','] ')';
AccReduction: 'reduction' '('op=AccReductionOperator ':' args+=ID[','] ')';
AccSeq: 'seq';
AccSelf: 'self' '(' args+=ID[','] ')';
AccTile: 'tile' '(' args+=ID[','] ')';
AccUseDevice: 'use_device' '(' args+=ID[','] ')';
AccVector: 'vector' ('(' args+=AccVectorArg ')')?;
AccVectorLength: 'vector_length' '(' n=INT ')';
AccWait: 'wait' '(' args+=ID[','] ')';
AccWorker: 'worker' ('(' args+=AccWorkerArg ')')?;
AccEndClause: 'end' construct=AccConstructs;
////////////////////////////////////////////////////
////////////////////////////////////////////////////
AccReductionOperator: ('+' | '-' | '*' | '/');
AccDefaultStatus: ('none' | 'present');
AccAtomicStatus: ('read' | 'write' | 'update' | 'capture');
AccWorkerArg: ('num' ':')? arg=INT ;
AccVectorArg: ('length' ':')? arg=INT ;
AccConstructs: ('parallel' | 'loop' | 'kernels');
AccGangArg: AccGangStaticArg | AccGangNumArg;
AccGangNumArg: ('num' ':')? arg=INT ;
AccGangStaticArg: 'static' ':' arg=INT ;
NotaStmt: /.*$/;
////////////////////////////////////////////////////
See script
.