Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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
[stdlib_linalg] Update eye function. #481
[stdlib_linalg] Update eye function. #481
Changes from 4 commits
ebc61cd
8745725
c2f0abf
c20f69f
c326353
2e4d681
File filter
Filter by extension
Conversations
Jump to
There are no files selected for viewing
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.
Could you avoid the
allocatable
status, like for other functions instdlib
?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.
(see #478 (comment), #477 (comment), and https://community.intel.com/t5/Intel-Fortran-Compiler/how-to-set-the-stack-size/td-p/933530)
It seems that
ifort
places the automatic array in the heap by default, which leads to astack overflow
when the dimension of the automatic array is large. Or is there any disadvantage of the allocatable array, need to avoid it?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.
My comment was based on @certik and @milancurcic 's comments (this comment and following ones).
Furthermore, the rules for stack vs heap can be different between compilers/OS, and can be also changed within a compiler through a compiler option (e.g., using Gfortran with
-Ofast
will imply-fstack-arrays
, that will put all arrays of unknown size and temporary arrays onto stack memory, which can create issues for very large arrays).Therefore, I am in favor to always use automatic arrays when possible.
@certik @milancurcic @awvwgk @ivan-pi Any comments on that topic?
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 may indeed be a big controversy, it seems to be: @awvwgk agrees with allocation array, @jvdp1 agrees with automatic array.
By default,
ifort
's automatic array solution faces large-scale arrays, it is easier to report an error: stack overflow. (see #478 (comment), #477 (comment), and https://community.intel.com/t5/Intel-Fortran-Compiler/how-to-set-the-stack-size/td-p/933530)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.
Yes, I suggest using automatic array wherever possible, and
allocatable
otherwise. In this case, it seems like you need to make itallocatable
because the second dimension depends on the presence of the optional dummy argument.However, if you re-write this to be two specific procedures under one generic name, instead of using the
optional
argument, then I think you don't needallocatable
for the result.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.
Yes, I'm not a fan of automatic arrays, since usage with
ifort
will lead to stack overflows. The option to allocate automatic arrays on the heap rather than on the stack is there, forifort
it happens to be buggy (heap allocation is not always freed).gfortran
is doing a little better here, but it is an issue as well.So far automatic array usage has resulted in a significant amount of support request from users for me. Setting the system stack with
ulimit -s unlimited
works, still this is something the user has to remember.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.
@awvwgk I don't think that's a good reason to avoid a language feature. If a feature (and a very old one) doesn't work with a compiler, let's report it. Avoiding it only helps permeate the bug with the compiler. I've been using this with ifort since 2010 and haven't seen an issue. It's possible that I didn't notice it.
The downside to the
allocatable
approach is that it's always on the heap. The user doesn't have the choice and always gets the less-performant implementation. Also, in theoptional
argument approach, it's possible (but I'm not sure) that the compiler would evaluate the branch inside the function at run-time rather than compile-time. If at run-time, that would be another performance penalty. It's possible that performance is less important foreye
, I don't know. And the advantage to theallocatable
approach is, of course, that it's always on the heap. :)@zoziha When resolving conversations as a GitHub feature, I suggest to leave a comment about what you decided, otherwise discussions get hidden but aren't really resolved. Maybe we should document this in the Code Review guide.
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 agree with @milancurcic: issues with some compilers/options/OS/... are not good reasons to avoid a feature of the language.
Futhermore, because it is a small function that would be most often (I guess) used in expressions (e.g., arr1 = eye(5) * scalar), I am also in favor to apply @milancurcic suggestion (i.e., to have 2 specific procedures under one generic name)
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.
@jvdp1 okay if we do it in a separate PR and merge this one first? We could evaluate the performance difference too.