SORU
5 Ocak 2010, Salı


Kullanma kuralları C kelime kısıtlamak?

Somut bir fayda sağlar ne C restrict anahtar kelime kullanmak için değil, anlamaya çalışıyorum.

Okuduktan sonra, "Demystifying The Restrict Keyword", ( hangi sağlar bazı kurallar başparmak kullanımı ), benim edindiğim izlenim, bir fonksiyonun ne zaman geçti göstericiler, bu hesap için olasılığını verileri işaret olabilir örtüşme (takma ad) ile başka bir bağımsız değişken olarak geçirilen içine fonksiyon. Bir fonksiyon verilir

foo(int *a, int *b, int *c, int n) {
    for (int i = 0; i<n;   i) {
        b[i] = b[i]   c[i];
        a[i] = a[i]   b[i] * c[i];
    } 
}

derleyici belki b c aynı konuma işaret edecek, çünkü ikinci ifadede c tekrar yükleyin. Ayrıca b beklemek aynı sebepten a yük önce depolanması gerekir. O zaman a depo edilmesi için beklemek ve bir sonraki döngü başında b c yeniden gerekir. Bu gibi işlev çağrısı:

int a[N];
foo(a, a, a, N);

sonra derleyici bunu yapmak için neden görebilirsiniz. restrict kullanarak etkili bir şekilde hiç c gereksiz yük bırakma ve b saklanmadan önce a yük böylece bunu yapmak, sen-ecek derleyici söyler.

In a different SO post, Nils Pipenbrinck, provides a working example of this scenario demonstrating the performance benefit.

Şimdiye kadar iyi bir fikir inlined olmayacak fonksiyonları içine geçmesi işaretçileri restrict kullanmak için topladım. Görünüşe göre eğer derleyici işaretçileri olmadığını anlamaya inlined kodu çakışıyor.

Şimdi burada işler benim için bulanık çekmeye başlayın.

Ulrich Drepper kağıt, "What every programmer should know about memory" yaptığı açıklamada, sürece kısıtlamak kullanılır, tüm işaretçi erişir potansiyel kaynakların aliasing" ve verdiği özel bir kod örneği, bir submatrix matris çarp nerede kullanıyor restrict.

Ben ya da restrict olan veya olmayan örnek kodu derlemek ancak, her iki durumda da aynı ikili. gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu4) kullanıyorum

Olayı çözemedim, aşağıdaki kodu olup olmadığını ihtiyacı için yeniden yapmak daha yaygın kullanımı restrict veya diğer analiz GCC olduğu için çok iyi olduğunu görebilmeniz için anlamaya hiçbiri bağımsız diğer birbirimize.Tamamen eğitim amaçlı, ve nasıl kullanılması restrict bu kod olursa olsun - ve neden?

restrict ile derlenmiş için

gcc -DCLS=$(getconf LEVEL1_DCACHE_LINESIZE) -DUSE_RESTRICT -Wextra -std=c99 -O3 matrixMul.c -o matrixMul

Sadece -DUSE_RESTRICT restrict kullanmak için kaldırın.

#include <stdlib.h>
#include <stdio.h>
#include <emmintrin.h>

#ifdef USE_RESTRICT
#else
#define restrict
#endif

#define N 1000
double _res[N][N] __attribute__ ((aligned (64)));
double _mul1[N][N] __attribute__ ((aligned (64)))
    = { [0 ... (N-1)] 
    = { [0 ... (N-1)] = 1.1f }};
double _mul2[N][N] __attribute__ ((aligned (64)))
    = { [0 ... (N-1)] 
    = { [0 ... (N-1)] = 2.2f }};

#define SM (CLS / sizeof (double))

void mm(double (* restrict res)[N], double (* restrict mul1)[N], 
        double (* restrict mul2)[N]) __attribute__ ((noinline));

void mm(double (* restrict res)[N], double (* restrict mul1)[N], 
        double (* restrict mul2)[N])
{
 int i, i2, j, j2, k, k2; 
    double *restrict rres; 
    double *restrict rmul1; 
    double *restrict rmul2; 

    for (i = 0; i < N; i  = SM)
        for (j = 0; j < N; j  = SM)
            for (k = 0; k < N; k  = SM)
                for (i2 = 0, rres = &res[i][j],
                    rmul1 = &mul1[i][k]; i2 < SM;
                      i2, rres  = N, rmul1  = N)
                    for (k2 = 0, rmul2 = &mul2[k][j];
                        k2 < SM;   k2, rmul2  = N)
                        for (j2 = 0; j2 < SM;   j2)
                          rres[j2]  = rmul1[k2] * rmul2[j2];
}

int main (void)
{

    mm(_res, _mul1, _mul2);

 return 0;
}

CEVAP
24 AĞUSTOS 2010, Salı


Ayrıca, GCC 4.0.0-4.4 kelime sınırla göz ardı neden olan bir gerileme hatası var. Bu hata, 4.5 (hata numarası olsa kaybettim) sabit olarak rapor edildi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • brokenbellsVEVO

    brokenbellsV

    11 EYLÜL 2009
  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011
  • FF Radioo

    FF Radioo

    14 ŞUBAT 2007