Wann ist flüchtig mit gemeinsamem CUDA-Speicher zu verwenden?

Unter welchen Umständen solltest du das benutzen?volatile Schlüsselwort mit dem Shared Memory eines CUDA-Kernels? ich verstehe dasvolatile weist den Compiler an, keine Werte zwischenzuspeichern, aber meine Frage bezieht sich auf das Verhalten mit einem gemeinsam genutzten Array:

__shared__ float products[THREADS_PER_ACTION];

// some computation
products[threadIdx.x] = localSum;

// wait for everyone to finish their computation
__syncthreads();

// then a (basic, ugly) reduction:
if (threadIdx.x == 0) {
    float globalSum = 0.0f;
    for (i = 0; i < THREADS_PER_ACTION; i++)
        globalSum += products[i];
}

Brauche ichproducts in diesem Fall volatil sein? Auf jeden Array-Eintrag greift nur ein einziger Thread zu, außer am Ende, wo alles von Thread 0 gelesen wird. Ist es möglich, dass der Compiler das gesamte Array zwischenspeichern kann, und so muss es seinvolatile, oder werden nur Elemente zwischengespeichert?

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage