/ / Passaggio di argomenti attraverso la memoria __local in OpenCL - memoria, opencl

Passare argomenti attraverso __local memory in OpenCL - memoria, opencl

Sono confuso sulla memoria __local in OpenCL qui. Ho letto alcune specifiche dicendo che il flusso di dati deve essere dall'host al __Global, quindi __Local. Ma vedo anche alcune funzioni del kernel in questo modo:

__kernel void foo(__local float * a)

Mi chiedevo come i dati fossero trasferiti direttamente in __local memoria in questo modo?

Grazie.

risposte:

3 per risposta № 1

Non è possibile riempire il buffer locale sul lato host. Pertanto è necessario seguire l'host di flusso -> __global -> __local.

Il buffer locale può essere creato sull'hostlato e poi viene passato come parametro del kernel o lato gpu all'interno del kernel. La creazione di un buffer locale sul lato host offre il vantaggio di decidere la sua dimensione prima che il kernel venga eseguito, il che può essere importante se la dimensione del buffer locale deve essere diversa ogni volta che il kernel viene eseguito.


1 per risposta № 2

La memoria locale non è visibile altro che asingolo gruppo di lavoro e può essere allocato poiché il gruppo di lavoro viene inviato dall'hardware su molte architetture. L'hardware in grado di mescolare più gruppi di lavoro da kernel diversi su ciascuna CU consentirà al componente di pianificazione di bloccare la memoria locale per ciascuno dei gruppi emessi. Non esiste prima dell'avvio del gruppo e non esiste dopo la fine del gruppo. La dimensione di questa regione è quella che passi come indicato da altre risposte.

Il risultato di ciò è che l'unico modo per moltile architetture per riempire la memoria locale dall'host dovrebbero essere per il codice del kernel da inserire dal compilatore che copierebbe i dati dalla memoria globale. Dato che come base, non è affatto peggio in termini di prestazioni per il programmatore farlo manualmente, e offre un maggiore controllo su ciò che accade esattamente. Non si finisce in una situazione in cui il compilatore genera sempre il codice di copia e termina copiare più del necessario perché l'API non ha chiarito quale memoria fosse stata copiata e cosa no.

In sintesi, non è possibile riempire la memoria locale in nessunomodo automatizzato. In pratica raramente lo vorrai, perché farlo manualmente ti dà l'opportunità di mettere solo il risultato di un primo stadio in locale, rimuovendo le operazioni di copia extra, o di trasformare i dati sulla strada in locale, consentendo il riempimento o il trasposizione dei dati per rimuovere i conflitti bancari e così via.


0 per risposta № 3

Come diceva @doqtor, la dimensione della memoria locale sul parametro del kernel può essere specificata da clSetKernelArg chiamate.

Fortunatamente, OpenCL 1.2+ supporta VLA (array di lunghezza variabile), il parametro del kernel di memoria locale non è più richiesto.