Questo sembra essere un vecchio post, ma permettimi di aggiornare questo post con alcune nuove informazioni. Si spera, potrebbe aiutare qualcun altro.
fa Globale Work Size (Dimensioni) devono essere multipli del gruppo di lavoro Size (Dimensioni) in OpenCL?
Risposta: True fino OpenCL 2.0. Prima di CL2.0, la dimensione del lavoro globale deve essere un multiplo delle dimensioni del lavoro locale, altrimenti verrà visualizzato un messaggio di errore quando si esegue clEnqueueNDRangeKernel.
Ma da CL2.0, questo non è più necessario. È possibile utilizzare qualsiasi dimensione di lavoro globale che si adatti alle dimensioni dell'applicazione. Tuttavia, ricorda che l'implementazione hardware potrebbe ancora utilizzare il "vecchio" modo, che significa riempire la dimensione del gruppo di lavoro globale. Pertanto, rende le prestazioni altamente dipendenti dall'architettura hardware. È possibile che si notino prestazioni piuttosto diverse su hardware/piattaforme differenti. Inoltre, vuoi rendere la tua applicazione compatibile per supportare la piattaforma precedente che supporta solo CL fino alla versione 1.2. Quindi, penso che questa nuova funzionalità aggiunta nel CL2.0 è solo per una facile programmazione, per ottenere migliori prestazioni controllabile e la compatibilità a ritroso, vi suggerisco di utilizzare ancora il seguente metodo citato da voi:
Aumentare le dimensioni del il lavoro globale deve essere il multiplo più vicino delle dimensioni del gruppo di lavoro, mantenendo lo stesso valore di ma controllando i limiti nel kernel per evitare il segfaulting, ovvero non eseguire nulla sugli elementi di lavoro fuori dal limite dell'output desiderato. (Questo sembra il modo migliore.)
Risposta: hai assolutamente ragione. Questo è il modo giusto per gestire questo caso. Progettare con cura le dimensioni del gruppo di lavoro locale (considerando fattori come l'utilizzo del registro, l'hit/miss della cache, il modello di accesso alla memoria e così via). E poi tampona le tue dimensioni di lavoro globali a un multiplo delle dimensioni del lavoro locale. Allora, sei a posto.
Un'altra cosa da considerare è che è possibile utilizzare l'oggetto immagine per memorizzare i dati anziché il buffer, se nel kernel sono presenti molti controlli di limiti. Per l'immagine, il controllo dei confini viene eseguito automaticamente dall'hardware, quasi senza sovraccarico nella maggior parte delle implementazioni. Pertanto, riempendo le dimensioni del lavoro globale, memorizzate i dati nell'oggetto immagine, quindi, è sufficiente scrivere normalmente il codice senza preoccuparsi del controllo dei confini.
Interessante che tu stia facendo questa domanda, come stavo chiedendo io stesso. La mia prima ipotesi è che tu mantenga una dimensione fissa del gruppo di lavoro e maneggi fuori da un ramo if. – Stringer