From: Reinhold Bader (bader-reinhold_at_t-online.de)
Date: Sun Apr 11 2010 - 13:41:55 PDT
Hello,
the following program, built with the Berkeley UPC (2.8 or 2.10)
installations on the sgi Altix (IA64) as well sgi ICE (Nehalem)
systems ...
#include <upc.h>
#include <stdlib.h>
#include <stdio.h>
shared [*] int a[THREADS][3];
int main(void) {
int i, j, q;
for (i=0; i<3; i++) {
a[MYTHREAD][i] = MYTHREAD;
}
upc_barrier;
if (MYTHREAD == 0) {
for (q=0; q<THREADS; q++) {
j = upc_threadof(&a[q][2]);
printf("a[%d][2] is on thread %d with value %d\n",q,
j,a[q][2]);
}
}
return 0;
}
... produces the following result.
upcrun -n 8 ./symmetric_data.exe
UPCR: UPC thread 1 of 8 on r1i2n2 (process 1 of 8, pid=5833)
UPCR: UPC thread 2 of 8 on r1i2n2 (process 2 of 8, pid=5834)
UPCR: UPC thread 3 of 8 on r1i2n2 (process 3 of 8, pid=5835)
UPCR: UPC thread 4 of 8 on r1i2n2 (process 4 of 8, pid=5836)
UPCR: UPC thread 5 of 8 on r1i2n2 (process 5 of 8, pid=5837)
UPCR: UPC thread 6 of 8 on r1i2n2 (process 6 of 8, pid=5838)
UPCR: UPC thread 7 of 8 on r1i2n2 (process 7 of 8, pid=5839)
UPCR: UPC thread 0 of 8 on r1i2n2 (process 0 of 8, pid=5832)
a[0][2] is on thread 2 with value 0
a[1][2] is on thread 3 with value 1
a[2][2] is on thread 4 with value 2
a[3][2] is on thread 5 with value 3
a[4][2] is on thread 6 with value 4
a[5][2] is on thread 7 with value 5
a[6][2] is on thread 0 with value 6
a[7][2] is on thread 1 with value 7
The value of upc_threadof() appears to be inconsistent with the
MYTHREADS value. On the other hand, the available documentation
repeatedly mentions constructions like
if (upc_threadof(&data) == MYTHREADS) {
...
}
to ensure locality of reference. Any explanations or hints?
Best Regards
--
Dr. Reinhold Bader
Leibniz-Rechenzentrum, Abt. Hochleistungssysteme | Tel. +49 89 35831 8825
Boltzmannstr. 1, 85748 Garching | Fax +49 89 35831 9700