2010-10-21 11 views
6

Sto solo imparando OpenMP da esercitazioni online e risorse. Voglio quadrare una matrice (moltiplicandola con se stessa) usando un ciclo parallel for. In IBM compiler documentation, ho trovato il requisito che "la variabile di iterazione deve essere un intero signed". Questo vale anche per l'implementazione GCC? È specificato nello standard OpenMP? Se è così, c'è una ragione per questo requisito?Perché le variabili del ciclo devono essere firmate in parallelo per?

(Non importa tanto quanto le dimensioni attesi sono di gran lunga più piccolo di INT_MAX, ma non mi è costato alcuni calchi.)

+0

Questa domanda è stata contrassegnata come un duplicato di [questo] (http://stackoverflow.com/questions/2820621), ma c'è una differenza, che è che ero specificamente interessato a OpenMP di GCC. –

risposta

5

In base alle specifiche OpenMP 3.0: http://www.openmp.org/mp-documents/spec30.pdf, per la variabile può essere di tipo intero con segno o senza segno, vedere 2.5.1 Conseguimento del ciclo. La domanda è se l'implementazione di OpenMP è conforme alle ultime specifiche.

+0

Accettato perché la restrizione è stata revocata nella 3.0, quindi probabilmente non c'era una buona ragione per la prima volta. –

8

Citando Why aren't unsigned OpenMP index variables allowed?:

In base alle specifiche OpenMP 2.0 C/C++ API (pdf), sezione 2.4.1, questa è una delle restrizioni del ciclo for. Nessun motivo è dato per questo, ma ho il sospetto che sia solo per semplificare le ipotesi che il codice e compilatore devono fare, dal momento che c'è codice speciale per assicurare che la gamma non trabocchi il valore massimo del tipo .

OpenMP 3.0 a quanto pare consente anche i tipi senza segno , ma non ho ancora visto in azione.

In breve, fa parte dello standard e la versione successiva consentirà numeri interi senza segno.

+0

Sono bloccato con GCC 4.3, che implementa OpenMP 2.5. Per ora getterò il mio 'size_t' su' int'. –

7

Ecco una possibile ragione dietro questo. Il same article dice che

  • b, ub, incr sono invariante di ciclo firmato espressioni intere e
  • exit_cond prende forma: iv <= ub o iv < ub o iv >= ub o iv > ub (dove iv è la variabile di iterazione vi chiedo circa)

dal la condizione exit_cond prevede un confronto e il confronto viene effettuato con una variabile firmata ub la variabile di loop iv deve essere firmato per evitare possibili problemi con il confronto firmato/senza segno.

+1

+1 per il motivo. È sempre bene sapere ** perché ** le cose sono come sono. – pmg

+2

Il che solleva la domanda sul perché le altre espressioni debbano essere 'firmate'. –

+0

Hm, non è una vera ragione. Se la ragione dovesse essere, devi avere i limiti e il contatore dello stesso tipo, inclusa la firma. Quello che comprerei. –

1

Per rispondere alla tua prima domanda su gcc. No, sembra che gcc accetta facilmente unsigned o size_t variabili di loop in qualcosa di simile a

#pragma omp parallel for 
for (size_t i = 0; i < N; ++i) { 
    /* do it */ 
} 

almeno la mia (gcc v 4.4 su un ubuntu 64bit) non si lamenta e fa la cosa giusta.

Problemi correlati