can a pointer to a 4x4 slice of a 5x5 array be CONTIGUOUS?

Sylwester Arabas sarabas@igf.fuw.edu.pl
Thu Jan 3 11:05:00 GMT 2013


Dear All,

A short question on the CONTIGUOUS attribute for pointers:

Do I understand correctly, that declaring a pointer to a 4x4 slice 
within a 5x5 array as CONTIGUOUS is incorrect? (as the elements pointed 
by the pointer do not constitute a contiguous region in the memory).

I'm asking as declaring such pointer CONTIGUOUS apparently triggers 
auto-vectorisation (reported with -ftree-vectorizer-verbose) which is 
not done without the CONTIGUOUS declaration:

...
378: create runtime check for data references MEM[(real(kind=8)[0:] 
*)pretmp_244][_158] and MEM[(real(kind=8)[0:] *)tmp$data_136][_155]
378: create runtime check for data references MEM[(real(kind=8)[0:] 
*)pretmp_246][_162] and MEM[(real(kind=8)[0:] *)tmp$data_136][_155]
378: created 2 versioning for alias checks.

378: === vect_do_peeling_for_loop_bound ===Setting upper bound of nb 
iterations for epilogue loop to 0

378: LOOP VECTORIZED.
...

The results are correct, there's apparently some speed-up, and similar 
vectorisation messages are printed for the same lines if instead of a 
pointer an (int:int, int:int) range is explicitly given.

Is it just by chance that the bogus (?) CONTIGUOUS declaration produces 
correct results, or is CONTIGUOUS still valid for a 4x4 slice of a 5x5 
array.

Thanks for help,
Sylwester

P.S. BTW, here's an example of quite a misleading error message:
$ gfortran -OFast aqq.f
f951: error: argument to ‘-O’ should be a non-negative integer

-Ofast works, and "fast" is not an integer

-- 
http://www.igf.fuw.edu.pl/~slayoo/



More information about the Fortran mailing list