Internal compiler error. BAD sptr in var_refsym

Hi,

I have created a dummy program and it already generates this error.

[bsc85539@p9login1 test]$ nvc++ main.cpp -gpu=cc70 -o main
NVC+±S-0000-Internal compiler error. BAD sptr in var_refsym 0 (main.cpp: 11)
NVC+±S-0039-Use of undeclared variable (main.cpp: 11)
NVC+±S-0094-Illegal type conversion required (main.cpp: 11)
NVC++/power Linux 22.9-0: compilation completed with severe errors

The code:

#include <stdio.h>

class myClass {
int i = 10;

public:
 void compute() {
	 #pragma omp target parallel for \
	 firstprivate(i) \
	 default(none)
	 for (int x = 0; x < i; x++)
	 {
		 printf("hello\n");
	 }
	printf("var value = %d\n", i);
}

};

int main(void) {

myClass x;
x.compute();

return 0;

}

I tried without -gpu=cc70 and got the same error. My SDK version is 22.9 but I tried older versions and it didn’t work either. What am I doing wrong?

If you need more information I will provide it to you.

Thank you.

Hi jreinal,

Looks to be a compiler issue when putting the loop bounds variable in a firstprivate clause. Appears to only occur when using the distribute model, but ok when using loop.

I’ve filed a problem report, TPR #33642, and sent it to engineering for review.

The work arounds are to either switch to using “loop”

#pragma omp target teams loop firstprivate(i) default(none)

or remove “firstprivate(i) default(none)”

#pragma omp target teams distribute parallel for

Thanks for the report!
Mat

Ok, but now another problem,

the code:

#include <stdio.h>

int main(void) {

int i = 1024; 
	#pragma omp target teams loop firstprivate(i)
	for (int x = 0; x < i; x++) {
		printf("var value = %d\n", x);
	}

return 0;

}

and I get:

$ nvc++ main.cpp -mp=gpu -o main
nvc+±Warning-CUDA_HOME has been deprecated. Please, use NVHPC_CUDA_HOME instead.
/apps/NVIDIA-HPC-SDK/22.9/Linux_ppc64le/22.9/compilers/share/llvm/bin/llc: error: /apps/NVIDIA-HPC-SDK/22.9/Linux_ppc64le/22.9/compilers/share/llvm/bin/llc: /tmp/nvc++Ue_dkXu4X-pk.ll:104:22: error: use of undefined value ‘%i’
store i32 %6, i32* %i, align 4, !dbg !40
^

This is only an example, the real code is more complex, so I need firstprivate, private, and so on.

I can’t stop crying.

Thank you!

Related but a different problem that was fixed in our 23.3 release.

Putting a loop bound variable is a firstprivate clause isn’t necessary, so the work around is to remove it.

Ok, thanks.

So, the copy of values are doing by default to pragma section when I use loop?

The last version available in CTE-POWER cluster at BSC is 22.9. I don’t know if they can install the newer version of sdk. But if this the solution is ok.

Thanks again.