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.
Ş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
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.
C kelime anlamı kısıtlamak nedir ?...
Kodlama Kuralları Adlandırma Çeteleler...
Devre dışı bırakma StyleCop kuralları...
Lambda kullanmak, Proc kullanma zamanı...
Anahtar kelime Kümesi aslında VBA ne y...