2010-10-21 24 views
6

Sadece çevrimiçi eğitim ve kaynaklardan OpenMP öğreniyorum. parallel for döngüsünü kullanarak bir matris (kendi ile çarpın) kare çizmek istiyorum. IBM compiler documentation'da "yineleme değişkeni signed tamsayı olmalıdır" gereksinimini buldum. Bu da KİK uygulamasında doğru mu? OpenMP standardında belirtildi mi? Eğer öyleyse, bu gereklilik için bir sebep var mı?Döngü değişkenleri neden paralel olarak imzalanmalıdır?

(O çok önemli değil beklenen boyutları INT_MAX çok daha küçüktür, ama o bana bazı yayınları mal olduğu gibi.)

+0

Bu soru, [bu bir] adlı dosyanın bir kopyası olarak işaretlenmiştir (http://stackoverflow.com/questions/2820621), ancak GCC'nin OpenMP'si ile özellikle ilgilendiğim bir fark vardır. –

cevap

5

OpenMP 3.0 belirtimine göre: http://www.openmp.org/mp-documents/spec30.pdf, değişken için imzalı veya imzasız tamsayı tipinde olabilir, bkz. 2.5.1 Döngü Oluşturma. Soru, OpenMP uygulamasının bu en son spesifikasyona uygun olup olmadığıdır.

+0

Kısıtlama 3.0'da kaldırıldığından kabul edildi, bu yüzden muhtemelen ilk etapta bunun için iyi bir neden yoktu. Nedeni için –

8

Why aren't unsigned OpenMP index variables allowed? alıntı:

OpenMP 2.0 C/C++ API şartnamesine göre (pdf), bölüm 2.4.1, for döngüsünün kısıtlamalarından biridir. Hiçbir neden bunun için verilen, ama menzil tipinin maksimum değerini aşmamasını sağlamak için özel bir kod var beri, kod ve derleyici yapmak zorunda olduğu varsayımları basitleştirmek sadece için şüpheli olduğunu .

OpenMP 3.0, imzasız türlere de izin verir, ancak henüz göremiyorum.

Kısacası, standardın bir parçasıdır ve sonraki sürüm, işaretsiz tam sayılara izin verecektir.

+0

OpenMP 2.5 kullanan GCC 4.3 ile sıkışıp kaldım. 'Size_t' işlevini şimdilik 'int' olarak atacağım. –

7

İşte bunun arkasındaki olası bir sebep. çünkü iv <= ub veya iv < ub veya iv >= ub veya iv > ub (iv yineleme değişkendir hakkında sormak)

: same article

  • b, ub, incr döngü değişkeni işaretli tamsayı ifadelerdir ve
  • exit_cond biçimini alır söylüyor exit_cond koşulu bir karşılaştırmayı içerir ve karşılaştırma ub değişkenine karşı iv döngü değişkenine karşı yapılır İmzalı/imzasız karşılaştırma ile olası problemleri önlemek için imzalanmalıdır.

+1

+1. Bunu bilmek her zaman iyidir ** neden ** şeyler oldukları gibi. – pmg

+2

Diğer ifadelerin niçin "imzalanmış" olması gerektiğini sorgulayan soru. –

+0

Hm, bu gerçek bir sebep değil. Sebep olsaydı, imzalılık da dahil olmak üzere, aynı türden sınırlar ve sayaçlara sahip olmanız gerekir. Ben satın alırdım. –

1

gcc ile ilgili ilk sorunuzu yanıtlamak için. Hayır, gcc kolayca en azından benim (bir 64bit ubuntu üzerinde gcc v 4.4) şikayet etmiyor

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

gibi bir şey içinde unsigned veya size_t döngü değişkenleri kabul eder ve doğru şeyi yapmıyor gibi görünüyor.

İlgili konular