Pergunta

Tenho brincado com OpenCL recentemente e sou capaz de escrever kernels simples que usam apenas memória global.Agora gostaria de começar a usar a memória local, mas não consigo descobrir como usá-la. get_local_size() e get_local_id() para calcular um "bloco" de saída por vez.

Por exemplo, digamos que eu queira converter o kernel de exemplo OpenCL Hello World da Apple para algo que use memória local.Como você faria?Aqui está a fonte original do kernel:

__kernel square(
    __global float *input,
    __global float *output,
    const unsigned int count)
{
    int i = get_global_id(0);
    if (i < count)
        output[i] = input[i] * input[i];
}

Se este exemplo não puder ser facilmente convertido em algo que mostre como usar a memória local, qualquer outro exemplo simples servirá.

Foi útil?

Solução

Achei que você já resolveu há mais espaço para melhorias.Eu vejo que você tem sua fonte em uma imagem e para cada personagem que você deseja desenhar você obter a parte da imagem com essa carta carregá-lo em uma textura e depois tudo o que precisa ser limpo.

Melhor carregar toda a imagem em uma grande textura, mantenha essa textura pela duração do seu programa e reutilize-a ao renderizar cada quadro.Você pode selecionar os caracteres certos para renderizar especificando as coordenadas de textura certa.

Você deve ser capaz de acertar sua tampa de 60fps com baixo uso de CPU, a menos que seu MacBook seja muito antigo.

Outras dicas

Há outra possibilidade de fazer isso, se o tamanho da memória local for constante. Sem usar um ponteiro na lista de parâmetros dos kernels, o buffer local pode ser declarado dentro do kernel apenas declarando -o __local:

__local float localBuffer[1024];

Isso remove o código devido a menos chamadas clsetkerNARG.

No OpenCL, a memória local destina-se a compartilhar dados entre todos os itens de trabalho em um grupo de trabalho.E geralmente é necessário fazer uma chamada de barreira antes que os dados da memória local possam ser usados ​​(por exemplo, um item de trabalho deseja ler dados da memória local que são gravados por outros itens de trabalho).A barreira é cara em hardware.Tenha em mente que a memória local deve ser usada para leitura/gravação repetida de dados.Os conflitos bancários devem ser evitados tanto quanto possível.

Se você não tomar cuidado com a memória local, poderá acabar tendo um desempenho pior em algum momento do que usar a memória global.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top