Domanda

Mi chiedo se è possibile utilizzare SSE (1,2,3,4, ...) per ottimizzare il ciclo seguente:

// u and v are allocated through new double[size*size]
for (int j = l; j < size-1; ++j)
{
    for (int k = 1; k < size-1; ++k)
    {
        v[j*size + k] = (u[j*size + k-1] + u[j*size + k+1] 
                       + u[(j-1)*size + k]+ u[(j+1)*size + k]) / 4.0;
    }
}

Il linguaggio [j*size + k] è usato per trattare il blocco di memoria, come se fosse un array multi-dimensionale.

Purtroppo la bandiera -ftree-vectorize per GCC (4.5) non crede che il ciclo è suscettibile di ottimizzazione SIMD-tipo. (Anche se dire che non ho mai visto -ftree-vectorize ottimizzare nulla, ma il più banale dei cicli).

Mentre io sono consapevole del fatto che ci sono molti altri modi per migliorare le prestazioni del ciclo (OpenMP, di svolgimento, in-place algoritmi, etc) Sono in particolare interessati a sapere se SIMD può essere utilizzato. Sto forse più interessato alla descrizione generale di come (se non del tutto) tale ciclo potrebbe essere trasformato, al contrario di una concreta attuazione.

È stato utile?

Soluzione

Sembra che dovrebbe essere possibile, ma dal momento che (a) si sta utilizzando doppie, (b) si sta facendo molto poco di calcolo relativo a I / O, (c) più moderne CPU x86-64 hanno due FPU in ogni caso, allora non si può ottenere molto di ritorno sugli investimenti di codifica SIMD.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top