From: George Caragea (george_at_east_dot_isi_dot_edu)
Date: Wed Jul 23 2008 - 13:02:23 PDT
Hi all,
I am using berkeley-upc-2.6.0 on an i686 Linux machine, with the online
translator. I am using the smp conduit, with pthreads (although I
disabled pthreads to pinpoint the problem). I think I have encountered
a bug either with the translator or the run-time system.
I am running the program below with one single thread (pthreads
disabled), but I cannot get the correct result. The program I am trying
to run is :
--------------
#include <upc_relaxed.h>
#include <stdio.h>
#include <upc.h>
shared int *twiddle;
//shared [1] int twiddle[2];
int main(){
twiddle = (shared int *) upc_all_alloc(1, 2*sizeof(int));
int TID=0;
int index = 1-TID;
twiddle[TID] = 1;
twiddle[1-TID] = 2;
//twiddle[index] = 2;
if(MYTHREAD == 0) {
int i;
for(i=0;i<2;i++){
printf("%d\n", twiddle[i]);
}
upc_free(twiddle);
}
}
---------------
I am compiling and running this with:
$ upcc -T 1 -pthreads=0 fft_1.upc -o fft_1
$ upcrun fft_1
However, instead of printing the values 1 and 2, I get some random
numbers in the array.
The problem seems to come from the line twiddle[1-TID]=2. If I use
twiddle[index] instead, it works just fine. I think there is some
casting problem. Running upcc -v I get these warnings from the translator:
!!!rearranging upc pointer arithmetic expression failed!!!
[...]
internal translator warning (from fft_1.upc:16): Attempt to directly
cast to upcr_{p}shared_ptr_t
Am I doing something incorrect in the code? Note that when I compile and
run this on a x86_64 machine, it works fine. This makes me think there
is a problem with casting between 32b/64b pointers and values, which
seems to be the case when I look in the output of the translator. The
problem also happens when I use an array instead of upc_all_alloc().
I am attaching my upcc --version output and the output of the translator
for reference.
Thank you,
George
#include <upc_relaxed.h>
#include <stdio.h>
#include <upc.h>
shared int *twiddle;
//shared [1] int twiddle[2];
int main(){
twiddle = (shared int *) upc_all_alloc(1, 2*sizeof(int));
int TID=0;
int index = 1-TID;
twiddle[TID] = 1;
twiddle[1-TID] = 2;
//twiddle[index] = 2;
if(MYTHREAD == 0) {
int i;
for(i=0;i<2;i++){
printf("%d\n", twiddle[i]);
}
upc_free(twiddle);
}
}