-
Notifications
You must be signed in to change notification settings - Fork 33
#1312 ScalarArray code generation #3101
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
| def scalar_array(self, scalar_arr_arg, var_accesses=None): | ||
| ''' | ||
| Override the default implementation as there's no need to specify | ||
| ScalarArrays for an OpenACC data region. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't true I'm afraid - they will need to be added to a data region. However, you could leave this as a TODO as I'm not sure we're ever going to need data regions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for that - it's currently a very rough draft so some of the comments are currently just borrowed from other functions. But, I will definitely note that down!
Codecov Report✅ All modified and coverable lines are covered by tests. ❌ Your project check has failed because you have indirect coverage changes. Learn more about Unexpected Coverage Changes and reasons for indirect coverage changes. Additional details and impacted files@@ Coverage Diff @@
## master #3101 +/- ##
==========================================
- Coverage 99.95% 99.95% -0.01%
==========================================
Files 378 379 +1
Lines 53723 53822 +99
==========================================
+ Hits 53701 53799 +98
- Misses 22 23 +1 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
This still isn't working as intended, but is getting closer to correct. As an example, the code gen is now adding the scalar arrays to the generated code, alongside the arrays containing their dimensions. However, it is not adding these dimensions to the generated code (e.g., no Furthermore, the stub_gen test is failing because we are currently adding the dimensions array to the psyir layer as an |
|
I'm having a little trouble getting Still trying to find what needs adding to fix this. |
|
This is now working and passing the tests with and without compilation. I'll warn you that I've had to do a slightly strange fix to correct the ordering of the declarations in code generation. As mentioned on Monday, there isn't a way of changing the order of declarations - they appear in the order that they are added to the symbol table. Since the ScalarArray is an argument it was always being added before the dimensions array, and this was causing compile time errors as the dimensions array is being used in the ScalarArray declaration. My fix for this is simply finding the ScalarArray in the symbol table and replacing it with itself, so that it is being added after the dimensions array. Hopefully you're happy with this This should now be ready for review again |
|
I'm not sure why CodeCov has only just decided that this was a problem. I've looked at the line it's complaining about (line 773 in arg_ordering.py) and I don't see an easy way of avoiding this problem without splitting I still think that this is ready for review, and would be interested if you have any thoughts about this |
arporter
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking good @mo-alistairp - well done!
There's a bit of tidying-up still to do and I'm asking that you make the test case a bit more involved. I suspect what you have is vulnerable to a name clash so you'll see I've asked you to switch to using a tag for the new variables.
I'll fire off the integration tests in the meantime.
| :py:class:`psyclone.core.VariablesAccessMap`] | ||
| ''' | ||
| # TODO: Add implementation of OpenACC data region for ScalarArrays |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please remove the TODO as otherwise our rule is that you need an associated Issue and I don't think we want another Issue :-)
| :py:class:`psyclone.core.VariablesAccessMap`] | ||
| ''' | ||
| # TODO: Add implementation of OpenACC data region for ScalarArrays |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, please document the NotImplementedError as a ":raises ...." in the docstring.
| Handles the declarations of ScalarArray kernel arguments appearing in | ||
| either an Invoke or a Kernel stub. | ||
| :param node: the Invoke or Kernel stub for which to manage the \ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please put back the description of the node argument.
| super().__init__(node) | ||
|
|
||
| # Initialise dictionaries of 'real', 'integer' and 'logical' | ||
| # ScalarArray arguments by data type and intent |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, please update the comment.
| if self._logical_scalar_arrays[intent]: | ||
| for arg in self._logical_scalar_arrays[intent]: | ||
| for arg in self._scalar_array_args[intent]: | ||
| if arg.intent in FORTRAN_INTENT_NAMES: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you need this if? If so, please add a comment.
| integer(kind=i_def) :: a_scalar | ||
|
|
||
| call invoke( & | ||
| testkern_scalar_array_type(afield,real_array,logical_array,integer_array,a_scalar) & |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Probably worth making this more complicated by including a second kernel call (to one of the existing test kernels) in the invoke. If you could make one of the variable names such that you would get a clash with the dims_real_field name that PSyclone generates then that would be great. (e.g. you could re-name "a_scalar" to "dims_real_field")
| if scal_multi_type: | ||
| raise GenerationError( | ||
| f"ScalarArray argument(s) {scal_multi_type} in Invoke " | ||
| f"'{self._invoke.name}' have different metadata for data " |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
perhaps replace everything after and including "have" with "is/are passed to more than one kernel and the kernel metadata for the corresponding arguments specifies different intrinsic types."? (I really struggled to understand this message at first.)
| for intent in FORTRAN_INTENT_NAMES: | ||
| for arg in self._scalar_array_args[intent]: | ||
| # Distinguish whether they are ScalarArrays | ||
| if (arg.descriptor.data_type not in |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it would be simpler to put this check at L150 - i.e. before we add arg into the _scalar_array_arg dictionary. That would save us having to loop through again to check what we've just added.
| f"{const.VALID_SCALAR_DATA_TYPES}.") | ||
|
|
||
| # Create declarations | ||
| self._create_declarations() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Regarding my comment on the special handling for kernel stubs in _create_declarations, I think probably you just get rid of this call and inline the relevant part of _create_declarations here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @arporter, can I just check what you want here. If I inline the _create_declarations function and remove it, it will need to be inlined into both invoke_declarations and stub_declarations. This will create some code duplication - are you happy with this cost to remove _create_declarations?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi Alistair, that's not quite what I meant. You can keep _create_declarations but move the stub-specific code out of it. There will be a little bit of duplication but I don't think it's much.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok sure, thanks for the clarification 😄
| create_arg_list.scalar(arg) | ||
| const = LFRicConstants() | ||
| assert (f"Expected argument type to be one of {const.VALID_SCALAR_NAMES} " | ||
| assert (f"Expected argument type to be one of " |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can probably extend this test to get coverage of that missed line. You'll neeed to create a create_arg_list = KernCallArgList(kernel) and then call scalar on it with an argument that isn't a scalar. If this works, please update the name and docstring of the test.
Adding code generation for ScalarArrays (towards #1312 ). The metadata support was added in #2173.