This is an ICE, and so should probably be fixed or warned against, but I thought I’d report it. Namely, while testing/shaking out some new GPU code, it turns out that you don’t want to name any array “XOR”–which sort of makes sense in this code, name-wise–as it seems to interfere with -Mcuda (as of PGI 12.4).
To test this, I copied the mmul_mod code from the end of the CUDA Fortran manual and put it in mmulmod.F90. I then copied that to a new file, mmulmod.xor.F90 and did a simple sed renaming Asub to XOR:
(339) > diff mmulmod.F90 mmulmod.xor.F90 19c19 - real, shared :: Asub(16,16), Bsub(16,16) --- + real, shared :: XOR(16,16), Bsub(16,16) 39c39 - ! loads one element of Asub and Bsub --- + ! loads one element of XOR and Bsub 41c41 - Asub(tx,ty) = A(i,kb+ty-1) --- + XOR(tx,ty) = A(i,kb+ty-1) 53c53 - Cij = Cij + Asub(tx,k) * Bsub(k,ty) --- + Cij = Cij + XOR(tx,k) * Bsub(k,ty)
Now when you compile:
(337) > pgfortran -Mcuda=keepgpu,keepptx,keepbin mmulmod.F90 /opt/pgi/linux86-64/12.4/lib/f90main.o: In function `main': f90main.c:(.text+0x40): undefined reference to `MAIN_' (338) > pgfortran -Mcuda=keepgpu,keepptx,keepbin mmulmod.xor.F90 mmulmod.xor.001.gpu(9): error: expected an identifier mmulmod.xor.001.gpu(59): error: expected an expression mmulmod.xor.001.gpu(69): error: expected an expression 3 errors detected in the compilation of "/tmp/pgnvdmhUK-FoMe3r.nv0". PGF90-F-0000-Internal compiler error. Device compiler exited with error status code 0 (mmulmod.xor.F90: 109) PGF90/x86-64 Linux 12.4-0: compilation aborted
where line 9 is:
9 __shared__ __align__(8) long long xor;
My guess is that naming an array the same name as an operation/intrinsic can lead to interesting clashes. The right thing to do is not use XOR as an variable name, but it is technically allowed in Fortran, right?