Domanda

L'esempio somma vettoriale ha questo codice:

// Asynchronous write of data to GPU device
ciErr1 = clEnqueueWriteBuffer(cqCommandQueue, cmDevSrcA, CL_FALSE, 0, sizeof(cl_float) * szGlobalWorkSize, srcA, 0, NULL, NULL);
ciErr1 |= clEnqueueWriteBuffer(cqCommandQueue, cmDevSrcB, CL_FALSE, 0, sizeof(cl_float) * szGlobalWorkSize, srcB, 0, NULL, NULL);
shrLog("clEnqueueWriteBuffer (SrcA and SrcB)...\n"); 
if (ciErr1 != CL_SUCCESS)
{
    shrLog("Error in clEnqueueWriteBuffer, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
    Cleanup(EXIT_FAILURE);
}

// Launch kernel
ciErr1 = clEnqueueNDRangeKernel(cqCommandQueue, ckKernel, 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL, NULL);
shrLog("clEnqueueNDRangeKernel (VectorAdd)...\n"); 
if (ciErr1 != CL_SUCCESS)

Si lancia il kernel subito dopo. Come funziona questo non causa problemi? Non stiamo garantendo che i buffer di memoria grafica è stata completamente scritti quando i lanci del kernel giusto?

È stato utile?

Soluzione

Mentre le scritture sono asincroni dal punto di vista di un host, essi non sono necessariamente asynchroneous dal punto di vista del dispositivo. Mi piacerebbe pensare che il commandqueue viene creato senza CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, quindi è un commandqueue in ordine.

La specifica OpenCL dice quanto segue riguardo esecuzione in-order:

  

In-ordine di esecuzione: I comandi vengono lanciati nell'ordine in cui appaiono nel Comando-   coda e completato in ordine. In altre parole, un comando preliminare sulle Completa coda   prima che il comando seguente inizia. Questo serializza l'ordine di esecuzione dei comandi in un   coda.

Quindi le scritture devono completare prima che il kernel viene eseguito sul dispositivo.

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