Como as GPUs organizam o trabalho: ou o que são gpu deformadas

As GPUs são construídas para velocidade, lidando com milhares de tarefas ao mesmo tempo. Mas como eles organizam tudo o que funciona? Este post mergulha em urdidores, um conceito-chave no desempenho da GPU, explicou passo a passo da perspectiva de um iniciante. Seguiremos a jornada da descoberta, construindo de perguntas básicas a idéias práticas, com exemplos para torná -la concreta. O que é uma urdidura e por que isso importa? Uma urdidura é um pequeno grupo de threads em uma GPU que trabalha juntos, executando o mesmo código ao mesmo tempo em diferentes dados. Pense nisso como uma equipe de trabalhadores em uma linha de montagem, todos fazendo a mesma tarefa, mas em itens separados. Normalmente, uma urdidura possui 32 threads, embora isso possa variar de acordo com a GPU. Esse agrupamento é crucial porque as GPUs são projetadas para processamento paralelo. Ao organizar tópicos em urdidores, a GPU pode executar muitas tarefas com eficiência, tornando -o perfeito para empregos como renderização de gráficos ou crise de dados. Entendendo os kernels: a descrição do trabalho da GPU Um kernel é a função que você escreve para a GPU executar. É o núcleo do seu programa, atravessando milhares de tópicos simultaneamente. Ao contrário de uma CPU, que processa tarefas uma a um, uma GPU executa o kernel em muitos pontos de dados de uma só vez. Por exemplo, imagine adicionar duas grandes listas de números. Uma CPU iria percorrer cada par. Um kernel da GPU, no entanto, atribui cada par a um encadeamento, adicionando -os em paralelo. Aqui está um exemplo simples de pseudocódigo: # kernel para adicionar duas listas do kernel add_lists (a, b, resultado, n): index = get_thread_id () se índice 5: dados[index] = dados[index] * 2 # Caminho a Else: Dados[index] = dados[index] + 1 # caminho B # Exemplo de entrada: dados = [3, 7, 4, 6, 8]
# Execute com 5 threads (1 Warp) # saída: dados = [4, 14, 5, 7, 16]
# Threads para 3, 4, 6 Seguir o caminho B; 7, 8 Seguir um caminho ENTER Modo de tela cheia Modo de tela cheia A GPU executa os dois caminhos sequencialmente: primeiro caminho a (threads de mascaramento onde false), depois o caminho b (threads de mascaramento onde true). Essa metade da eficiência se os threads se dividem uniformemente. Escrevendo código livre de divergência para velocidade para evitar a divergência, gravar código paralelo de dados com condicionais mínimos. Um truque é usar operadores matemáticos ou ternários em vez de if-else. Para o exemplo acima, reescreva -o como: kernel process_data (dados, n): index = get_thread_id () se índice < n:
data[index] = (data[index] > 5)? dados[index] * 2: dados[index] + 1 # mesma entrada: dados = [3, 7, 4, 6, 8]
# Saída: dados = [4, 14, 5, 7, 16]
# Todos os threads executam a mesma instrução Digite o modo de saída de tela cheia de tela cheia que isso geralmente compila com uma única instrução, mantendo a urdidura unificada. Para uma lógica complexa, considere mover condicionais para a CPU ou reestruturar dados para alinhar threads. Projeto de desempenho da GPU A chave para a programação da GPU é uma mentalidade paralela a dados. Evite condicionais aninhados, à medida que multiplicam caminhos divergentes, que mesmo os compiladores inteligentes nem sempre podem consertar. Em vez disso, projete algoritmos em que todos os threads executam operações uniformes, como matrizes matemáticos ou filtros de imagem. Por exemplo, a classificação de dados antes de um kernel pode agrupar condições semelhantes, reduzindo a divergência. Teste seu código com ferramentas de perfil para identificar e corrigir a divergência. As urdidores são a espinha dorsal do desempenho da GPU, permitindo um paralelismo maciço por meio de instruções compartilhadas. Ao entender as deformações e escrever um código livre de divergência, você pode aproveitar o poder total da GPU. O LiveReview ajuda você a obter ótimos comentários sobre seu PR/MR em alguns minutos. Economiza horas em todos os relações públicas, dando críticas rápidas e automatizadas de primeira passagem. Se você está cansado de esperar que seu colega revise seu código ou não esteja confiante de que eles fornecerão feedback válido, aqui está o LiveReview para você.

Fonte

Você pode ter perdido