/ / Slučka cez viacrozmerné polia - c ++, polia, slučky, viacrozmerné polia

Smyčka prostredníctvom multidimenzionálnych polí - c ++, polia, slučky, multidimenzionálne pole

Našla som toto článok o tom, ako rýchlo prepínať prostredníctvom mnohorozmerných polí.

používam Method 6: Nested loops with linear array and single incrementing index.

Hovorí Method 8: Single loop with linear array and incrementing index je rýchlejšia, ale vyžadujem tiež indexy vnorených slučiek. Keď sa pokúsim vypočítať indexy vnorených slučiek pomocou klauzúl if, môj kód sa spomaľuje (prinajmenšom najhoršie ako prístup vnorenej slučky).

Môžete odporučiť niečo na výpočet jednotlivých indexov?

 int x1=0,x2=0;
for (int i1 = 1; i1 <= 10000; i1++){
for (int i = 0; i < 10000; i++){

x1++;
if(x1>=100){
x1=0;
x2++;
}

if (x1 > 10)
{
a[i] += a[i - 10*1];
}
if (x2 < 95)
{
a[i] += a[i + 5*100];
}
}
}

Pre viacrozmernú štruktúru poľa a[x1][x2], Chcem počítať a[x1][x2]=a[x1-10][x2]+a[x1][x2+5] ktorý a[x1][x2] je previesť na a[x1+x2*100]

Programový kód

 method 8: 462 ns
method 6 297 ns

Existuje spôsob, ako môžem vylepšiť tento kód z hľadiska rýchlosti?

odpovede:

0 pre odpoveď č. 1

Používate nesprávny index, mal by byť a[ROWS][COLS] a index i = row * COLS + col, Potom nepotrebujete ifs vo vnútornej slučke, môžete to napísať takto:

double *v = a + 1000;    // destination
double *c = a;           // source is 10 rows before, using another pointer
// to take advantage of proximity in cache
for( x1 = 10; x1 < 100; x1++ ) {
for( int x2 = 0; x2 < 95; x2++) {
*v += *c + *(v + 5);
++v;
++c;
}
v += 5;  // skip the last 5 columns
c += 5;
}

To mi dá výsledok ~ 130 pomocou on-line kompilátora pri odkaze, ktorý ste uverejnili


0 pre odpoveď č. 2

Pri pohľade na váš kód sa môžete vyhnúť obom slučkámrobiť výpočet sami, čo je určite menej efektívne ako to, čo kompilátor dokáže. Navrhujem, aby ste si nechali dve slučky, ale rozdelili ste slučky, aby ste sa vyhli podmienkam v nich, aby ich kompilátor mohol transformovať na kód SIMD.

for(int i=0; i<10; i++) {
for(int j=0; j<95; j++) {
a[i * 100 + j] = a[i *100 + j + 5]
}
}
for(int i=10; i<100; i++) {
for(int j=0; j<95; j++) {
a[i * 100 + j] = a[(i - 10) * 100 + j] + a[i *100 + j + 5]
}
}
for(int i=10; i<100; i++) {
for(int j=95; j<100; j++) {
a[i * 100 + j] = a[(i - 10) * 100 + j]
}
}

Čítanie kódu bude jednoduchšie.

Netestoval som to tu, ale pre väčšiu maticu je možné vylepšiť výkon, aby sa cache mohla lokalizovať. Keď sa pozriete na svoj kód, môžete na to použiť obklady.