BR112016002637B1 - Método e sistema de computação para sincronizar threads em um grupo de threads, e memória legível por computador - Google Patents
Método e sistema de computação para sincronizar threads em um grupo de threads, e memória legível por computador Download PDFInfo
- Publication number
- BR112016002637B1 BR112016002637B1 BR112016002637-3A BR112016002637A BR112016002637B1 BR 112016002637 B1 BR112016002637 B1 BR 112016002637B1 BR 112016002637 A BR112016002637 A BR 112016002637A BR 112016002637 B1 BR112016002637 B1 BR 112016002637B1
- Authority
- BR
- Brazil
- Prior art keywords
- threads
- barrier
- thread
- group
- width
- Prior art date
Links
- 238000000034 method Methods 0.000 title claims description 30
- 230000004888 barrier function Effects 0.000 claims abstract description 254
- 230000004044 response Effects 0.000 claims abstract description 13
- 230000008569 process Effects 0.000 claims description 9
- 230000001360 synchronised effect Effects 0.000 claims description 5
- 238000004364 calculation method Methods 0.000 abstract description 3
- 230000009467 reduction Effects 0.000 description 13
- 238000004590 computer program Methods 0.000 description 11
- 238000010586 diagram Methods 0.000 description 11
- 239000011159 matrix material Substances 0.000 description 6
- 230000006870 function Effects 0.000 description 4
- 238000004891 communication Methods 0.000 description 3
- 238000013500 data storage Methods 0.000 description 3
- 238000003491 array Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 239000000835 fiber Substances 0.000 description 2
- 239000012634 fragment Substances 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000004883 computer application Methods 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3851—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3887—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3887—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
- G06F9/38873—Iterative single instructions for multiple data lanes [SIMD]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3888—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple threads [SIMT] in parallel
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30076—Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
- G06F9/30087—Synchronisation or serialisation instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/522—Barrier synchronisation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Advance Control (AREA)
- Devices For Executing Special Programs (AREA)
- Multi Processors (AREA)
Abstract
SINCRONIZAÇÃO DE BARREIRA COM CÁLCULO DINÂMICO DE LARGURA. Um sequenciador de uma unidade de processamento determina, durante a execução, uma largura de barreira de uma operação de barreira para um grupo de cadeias, sendo que a largura da barreira é menor do que um número total de cadeias no grupo de cadeias, e sendo que as cadeias no grupo de cadeias executam o código de dados paralelos um uma ou mais unidades de computação. Em resposta à cada cadeia em um subgrupo do grupo de cadeias que executou a operação de barreira, o subgrupo incluindo um mesmo número de cadeias que a largura da barreira, o sequenciador pode permitir que o subgrupo do grupo de cadeias execute nos um ou mais processadores depois da operação de barreira sem esperar por outras cadeias no grupo de cadeias executarem a operação de barreira, sendo que o subgrupo do grupo de cadeias é menor que o número total de cadeias no grupo de cadeias.
Description
[0001] Esta divulgação refere-se à execução de instruções de computação e mais particularmente refere-se à sincronização de instruções de computação que executam em paralelo.
[0002] Tradicionalmente, os programas de computador têm sido escritos como programas sequenciais em que o código dos programas de computador é executado sequencialmente em um único processador convencional. No entanto, pelo fato de que o desempenho dos processadores especializados, tais como unidades de processamento gráfico (GPUs), que incluem vários núcleos de processamento continua a aumentar a uma taxa rápida, os programas de computador estão cada vez mais sendo escritos para tirar proveito de tais processadores especializados. Por exemplo, os programas de computador estão sendo escritos para incluir códigos de dados paralelos, de modo que o mesmo código pode funcionar através de vários núcleos de processamento de um processador para funcionar em um conjunto de dados em paralelo. Porque tais código de dados paralelos é executado em paralelo ao invés de sequencialmente, pode não existir garantia quanto à ordem na qual o código irá concluir o processamento do conjunto de dados. Portanto, pode ser desejável sincronizar a execução em paralelo para assegurar que os vários núcleos de processamento tenham terminado de operar no conjunto de dados antes dos valores dos dados serem utilizados em quaisquer outras operações.
[0003] Em geral, esta divulgação descreve técnicas para sincronizar instruções de computação que são processadas em paralelo usando cálculo de largura de barreira dinâmica. Um bloco de threads pode cada executar o mesmo conjunto de instruções sobre um conjunto de dados, e as operações de barreira podem ser usadas para sincronizar o bloco de threads após as threads executarem as respectivas operações de escrita no conjunto de dados e antes das threads executarem as respectivas operações de leitura no conjunto de dados, para impedir que as operações de leitura façam a leitura incorreta ou invalidem os dados. Pelo padrão, a operação de barreira pode sincronizar todas as threads em um bloco de threads, de modo que nenhuma das threads possa executar operações de leitura subsequentes a uma operação de barreira a menos que toda e qualquer thread no bloco tenha executado uma respectiva operação de barreira. Em contraste, as técnicas divulgadas aqui podem incluir técnicas para calcular dinamicamente a largura de uma operação de barreira, de modo que um subconjunto de threads de um bloco pode avançar para executar operações de leitura após executar as respectivas operações de barreira mesmo se outras threads no bloco ainda precisem executar as suas operações de barreira.
[0004] Em um exemplo, um método para sincronizar threads inclui determinar, durante a execução de um aplicativo em execução em um hospedeiro que inclui código de dados paralelo a ser executado por uma unidade de processamento operacionalmente acoplada ao hospedeiro, uma largura de barreira de uma operação de barreira para um grupo de threads em que cada uma executa o código de dados paralelos, sendo que a largura da barreira é menor do que um número total de threads no grupo de threads, e sendo que threads no grupo de threads executam o código de dados paralelos um uma ou mais unidades de computação da unidade de processamento. O método inclui ainda em resposta à cada thread em um subgrupo do grupo de threads que executou as respectivas operações de barreira, o subgrupo incluindo um mesmo número de threads como a largura de barreira determinada, possibilitando que o subgrupo do grupo de threads execute respectivas operações nas uma ou mais unidades de computação subsequentes às respectivas operações de barreira sem esperar por outras threads no grupo de threads executarem operações de barreira, sendo que o subgrupo do grupo de threads é menor que o número total de threads no grupo de threads.
[0005] Em outro exemplo, um sistema de computação inclui um sistema de computação para sincronizar threads. O sistema de computação inclui um hospedeiro. O sistema de computação inclui ainda uma unidade de processamento operacionalmente acoplada ao hospedeiro. O sistema de computação inclui ainda um módulo sequenciador configurado para: determinar, durante a execução de um aplicativo em execução no hospedeiro que inclui código de dados paralelos a serem executados pela unidade de processamento, uma largura de barreira de uma operação de barreira para um grupo de threads em que cada uma executa o código de dados paralelos em uma ou mais unidades de computação da unidade de processamento, sendo que a largura da barreira é menor do que um número total de threads no grupo de threads, e em resposta à cada thread em um subgrupo do grupo de threads que executou as respectivas operações de barreira, o subgrupo incluindo um mesmo número de threads como a largura de barreira determinada, permitir que o subgrupo do grupo de threads execute respectivas operações nas uma ou mais unidades de computação subsequentes às respectivas operações de barreira sem esperar por outras threads no grupo de threads executarem operações de barreira, em que o subgrupo do grupo de threads é menor que o número total de threads no grupo de threads.
[0006] Em outro exemplo, um equipamento de processamento paralelo inclui meios para determinar, durante a execução de um aplicativo em execução em um hospedeiro que inclui código de dados paralelo a ser executado por uma unidade de processamento operacionalmente acoplada ao hospedeiro, uma largura de barreira de uma operação de barreira para um grupo de threads em que cada uma executa o código de dados paralelos um uma ou mais unidades de computação da unidade de processamento, sendo que a largura da barreira é menor do que um número total de threads no grupo de threads. O equipamento de processamento paralelo inclui ainda em resposta à cada thread em um subgrupo do grupo de threads que executou as respectivas operações de barreira, o subgrupo incluindo um mesmo número de threads que a largura de barreira determinada, meios para possibilitar que o subgrupo do grupo de threads execute respectivas operações nas uma ou mais unidades de computação subsequentes às respectivas operações de barreira sem esperar por outras threads no grupo de threads executarem operações de barreira, em que o subgrupo do grupo de threads é menor que o número total de threads no grupo de threads.
[0007] Em outro exemplo, um meio de armazenamento legível por computador pode conter instruções que, quando executadas por pelo menos um processador, fazem com que pelo menos um processador realize as operações. As operações incluem determinar, durante a execução de um aplicativo em execução em um hospedeiro que inclui código de dados paralelo a ser executado por uma unidade de processamento operacionalmente acoplada ao hospedeiro, uma largura de barreira de uma operação de barreira para um grupo de threads em que cada uma executa o código de dados paralelos, em que a largura da barreira é menor do que um número total de threads no grupo de threads, e em que threads no grupo de threads executam o código de dados paralelos um uma ou mais unidades de computação da unidade de processamento. As operações incluem ainda em resposta à cada thread em um subgrupo do grupo de threads que executou as respectivas operações de barreira, o subgrupo incluindo um mesmo número de threads que a largura de barreira determinada, possibilitando que o subgrupo do grupo de threads execute as respectivas operações nas uma ou mais unidades de computação subsequentes às respectivas operações de barreira sem esperar por outras threads no grupo de threads executarem operações de barreira, em que o subgrupo do grupo de threads é menor que o número total de threads no grupo de threads.
[0008] Os detalhes de um ou mais exemplos são apresentados nos desenhos anexos e na descrição abaixo. Outros recursos, objetos, e vantagens serão evidentes a partir da descrição e desenhos, e a partir das reivindicações.
[0009] FIG. 1 é um diagrama conceitual que ilustra a sincronização de threads de acordo com alguns aspectos da presente divulgação.
[0010] FIG. 2 é um diagrama em blocos que ilustra um sistema de computação de processamento paralelo de acordo com alguns aspectos da presente divulgação.
[0011] FIG. 3 é um diagrama conceitual que ilustra a sincronização de threads usando uma largura de barreira dinâmica de acordo com alguns aspectos da presente divulgação.
[0012] FIG. 4 é um diagrama conceitual que ilustra uma redução paralela exemplar de acordo com alguns aspectos da presente divulgação.
[0013] FIG. 5 é um fluxograma que ilustra um processo exemplar de sincronização de threads usando uma barreira dinâmica de acordo com alguns aspectos da presente divulgação.
[0014] FIG. 6 é um diagrama em blocos que ilustra um exemplo de um dispositivo que pode ser configurado para implementar um ou mais aspectos desta divulgação.
[0015] Em geral, esta divulgação descreve técnicas para sincronizar instruções de computação que são processadas em paralelo usando cálculo de largura de barreira dinâmica. No processamento paralelo de dados, um programa de computador pode incluir código de dados paralelos. O código de dados paralelos é um conjunto de instruções de computação que pode ser aplicado simultaneamente em vários elementos de processamento através de várias threads de execução de modo que o mesmo conjunto de instruções de computação pode ser executado para realizar a mesma operação em vários pontos de dados diferentes em paralelo. Cada invocação individual do mesmo código de dados paralelos para funcionar em um ou vários pontos de dados é uma thread e as threads podem executar simultaneamente para executar as mesmas instruções em vários pontos de dados. Tipicamente, o código de dados paralelos pode incluir operações de escrita para escrever para um conjunto de dados e, após as operações de escrita, as operações de leitura que leem o conjunto de dados que foram escritos pelas operações de escrita. No entanto, nem toda thread que é executada pode concluir a execução das operações de escrita ao mesmo tempo. Se as operações de leitura para ler um conjunto de dados são executadas antes de cada thread ter concluído as operações de escrita para escrever o conjunto de dados, então as operações de leitura podem fazer a leitura incorreta ou invalidar os resultados. Para garantir que as operações de leitura não leem incorretamente ou invalidam os resultados, pode ser necessário que cada thread execute uma operação de barreira após executar as operações de escrita de dados paralelos no conjunto de dados antes de avançar para a execução das operações de leitura no conjunto de dados, e não pode ser permitido que nenhuma das threads para executar o código de dados paralelos avance após executar as operação de barreira para executar as operações de leitura até que todas as threads também tenham executado as operação de barreira.
[0016] FIG. 1 é um diagrama conceitual que ilustra a sincronização de threads de acordo com alguns aspectos da presente divulgação. Como mostrado na FIG. 1, as threads 102, 104, 106, e 108 podem executar o código de dados paralelos em paralelo para cada uma realizar as operações de escrita para um conjunto de dados e para subsequentemente cada uma realizar as operações de leitura no conjunto de dados. No momento t1, a thread 106 terminou suas operações de escrita e chega à operação de barreira 110. A operação de barreira 110 indica que a thread 106 concluiu a execução de suas operações de escrita. No entanto, porque nem toda thread chegou a uma operação de barreira (i.e., as threads 102, 104, e 108 não concluíram a execução das respectivas operações de escrita), a thread 106 deve esperar até as outras threads 102, 104, e 108 também terem chegado à operação de barreira antes de avançar para a execução das operações de leitura para ler o conjunto de dados. No momento t2, a thread 102 chega à operação de barreira 112 porque a thread 102 finalizou a execução de suas operações de escrita. Similar à thread 106, porque as threads 104 e 108 também ainda não alcançaram uma operação de barreira, a thread 102 também deve esperar até as threads 104 e 108 também terem chegado à operação de barreira antes de avançar para a execução das operações de leitura para ler o conjunto de dados. No momento t3, a thread 104 chega à operação de barreira 114. Similar às threads 102 e 106, porque a thread 108 também ainda tem que chegar a uma operação de barreira, a thread 104 também deve esperar até a thread 108 também ter chegado à operação de barreira antes de avançar para a execução das operações de leitura para ler o conjunto de dados. No momento t4, a thread 108 chega à operação de barreira 116. Porque toda thread 102, 104, 106, e 108 no grupo de threads chegou a uma operação de barreira, cada uma das threads 102, 104, 106, e 108 são agora uma permitida a executar as operações de leitura para ler o conjunto de dados.
[0017] No entanto, a operação de barreira que exige que as threads em um grupo de threads esperem por cada thread no grupo de threads alcançar a operação de barreira antes de permitir que as threads no grupo avancem pode ser ineficiente. Por exemplo, as operações de leitura a serem realizadas após a execução da escrita podem depender somente de algumas (mas não todas) das threads finalizarem sua respectiva execução das operações de escrita. Assim, mesmo se todas das threads dependessem das operações adicionais terem alcançado a operação de barreira, aquelas threads não podem executar suas respectivas operações de leitura até que cada thread no grupo tenha finalizado a execução de suas respectivas operações de escrita e alcançado a operação de barreira.
[0018] Um fragmento de código exemplar escrito na linguagem C que mostra tal uso da operação de barreira é mostrado abaixo:
[0019] Como mostrado no fragmento de código acima, a operação de barreira é o ponto de sincronização para um grupo de threads em que cada um realiza o if (thread_id % 32) {ptr [thread_id%32] = valor; } escrever a operação antes do subsequente x = ptr [thread_id%32] a leitura da operação é realizada, garantindo assim que ptr [thread_id%32] é lida a partir de e à variável x é atribuído o valor de ptr [thread_id%32] somente após cada thread no grupo ter finalizado a realização da operação if (thread_id % 32) { ptr [thread_id%32] = value; } e ter atingido o ponto de sincronização. No entanto, porque thread_id%32 produzirá valores de somente 0 a 31, pode ser desnecessário que cada thread no grupo de threads espere até cada thread ter realizado a operação de barreira antes de realizar a operação x = ptr [thread_id%32] se o grupo inclui mais de 32 threads. Preferivelmente, pode ser necessário somente para os grupos de 32 threads esperarem para garantir que a operação x = ptr [thread_id%32] funcionará corretamente. Portanto, se o grupo de threads inclui mais de 32 threads, a operação de barreira pode ser mais inclusiva ao exigir que mais threads do que é necessário esperem para garantir a integridade da operação x = ptr [thread_id%32].
[0020] Uma abordagem para reduzir as ineficiências das operações de barreira pode incluir especificar uma largura da operação de barreira. A largura da operação de barreira pode ser o número de threads necessário para alcançar a operação de barreira antes de permitir que as threads avancem após a operação de barreira, e a largura pode tipicamente ser especificada para ser menos do que o número total de threads no grupo de threads. Por exemplo, a operação de barreira pode assumir uma largura como um parâmetro. Em outro exemplo, a largura pode ser especificada como uma constante. Durante a compilação a largura para a operação de barreira pode ser fixada no código no programa de computador que chama a operação de barreira. Para o fragmento de código exemplar acima, uma largura de 32 pode ser especificada durante a compilação para a operação de barreira.
[0021] No entanto, a fixação no código da largura das operações de barreira durante a compilação pode limitar a flexibilidade e utilidade das operações de barreira porque pode não ser útil para situações onde a largura desejada das operações de barreira não é conhecida durante a compilação. Além disso, os programadores que escrevem o código de dados paralelos podem não conhecer a largura adequada para especificar. Portanto, pode ser desejável calcular dinamicamente a largura das operações de barreira no momento da execução.
[0022] A FIG. 2 é um diagrama em bloco que ilustra um sistema de computação de processamento paralelo para executar o código de dados paralelos de acordo com alguns aspectos da presente divulgação. Como mostrado na FIG. 2, o hospedeiro 220 pode ser comunicativamente acoplado à unidade de processamento 202. A unidade de processamento 202 pode incluir unidades de computação 204A- 204N ("unidades de computação 204"), e cada uma das unidades de computação 204 pode incluir elementos de processamento 206A-206N ("elementos de processamento 206").
[0023] O hospedeiro 220, em alguns exemplos, pode ser um microprocessador, como uma unidade de processamento central (CPU), que é configurada para processar as instruções de um programa de computador para execução dentro do sistema de computação de processamento paralelo. Em alguns exemplos, o hospedeiro 220 pode, ao encontrar o código de dados paralelos durante a execução de um programa de computador, comunicar o código de dados paralelos à unidade de processamento 202 para execução.
[0024] A unidade de processamento 202 pode ser uma unidade de processamento de gráficos (GPU) ou qualquer outra unidade de processamento adequada que é configurada para processar pelo menos algumas das instruções dos programas de computador. A unidade de processamento 202 pode ser operacionalmente acoplada ao hospedeiro 220 e pode receber o código de dados paralelos de um programa de computador a partir do hospedeiro 220. A unidade de processamento 202 pode incluir um ou mais processadores programáveis, como unidades de computação 204. As unidades de computação 204 podem cada uma incluir elementos de processamento 206. As unidades de computação 204 podem cada uma incluir memória local (i.e. cache). Os elementos de processamento 206 podem ser núcleos de processamento das respectivas unidades de computação 204. Por exemplo, elementos de processamento 206 podem cada um incluir uma ou mais unidades lógicas aritméticas (ALUs) ou outros circuitos configurados para realizar operações aritméticas e lógicas.
[0025] Cada invocação individual do mesmo código de dados paralelos para funcionar em um ou vários pontos de dados é uma thread e as threads podem executar simultaneamente para executar as mesmas instruções em vários pontos de dados. Em alguns exemplos, as threads também podem ser conhecidas como itens de trabalho. A unidade de processamento 202 pode agrupar as threads em blocos. Tipicamente, a unidade de processamento 202 pode agrupar todas as threads produzidas pelo mesmo código de dados paralelos em um ou mais blocos. Em alguns exemplos, os blocos também podem ser conhecidos como grupos de trabalho. Em alguns exemplos, todas as threads em um bloco único podem ser limitadas a serem realizadas em uma das unidades de computação 204. Em alguns exemplos, um bloco de threads pode ser um grupo de threads onde a operação de barreira pode, se uma largura da operação de barreira não é especificada ou determinada para ser menor que o número de threads no grupo, se aplicar a cada thread no grupo. Assim, se a thread no grupo de threads alcança tal barreira, então a thread pode ter que esperar por cada thread no grupo também chegar à barreira antes da thread ser deixada avançar após a barreira.
[0026] A unidade de processamento 202 pode agrupar as threads dentro de um bloco em uma ou mais distorções ou frentes de onda. Uma frente de onda é uma unidade básica de programação para unidades de computação 204 e pode tipicamente incluir um subconjunto das threads em um bloco. Por exemplo, dado um bloco de 512 threads, uma frente de onda pode incluir 32 threads, e as threads no bloco podem ser agrupadas em 512/32 = 16 distorções. Uma frente de onda pode tipicamente incluir a mesma quantidade de threads que a de elementos de processamento 206 em uma unidade de computação única (i.e., unidade de computação 204A), de modo que os elementos de processamento 206 de uma unidade de computação única possam processar simultaneamente cada thread em uma frente de onda.
[0027] Porque uma frente de onda das threads executa as mesmas instruções em vários elementos de dados, o hospedeiro 220 pode vetorizar os dados a serem processados pela frente de onda em um vetor de dados e pode comunicar esse vetor para a unidade de processamento 202. Tipicamente, os dados são agrupados em vetores tendo a mesma quantidade de elementos que a de threads em uma única frente de onda. Em outras palavras, o número de threads em uma frente de onda é o mesmo que a largura do vetor de dados em que ela opera. Portanto, o número de threads em uma frente de onda pode ser referido como a largura do vetor da frente de onda.
[0028] Como discutido acima, uma frente de onda contém o mesmo número ou menos threads do que o número de elementos de processamento 206 em uma unidade de computação única. Portanto, todas as threads de uma frente de onda podem ser executadas em paralelo pelos elementos de processamento 206 de uma unidade de computação única ao mesmo tempo porque nenhuma thread na frente de onda tem que esperar por uma unidade de processamento ocupada finalizar o processamento de outra thread na mesma frente de onda. Portanto, as threads de uma frente de onda única podem ser garantidas para executar substancialmente em paralelo, de modo que uma operação de barreira pode não ser necessária para sincronizar as threads dentro de uma frente de onda única.
[0029] Uma da unidade de computação 204 pode executar uma ou mais frentes de onda em paralelo usando elementos de processamento 206 da unidade de computação 204. Quando as threads de um bloco são executadas, as operações de barreira podem ser usadas para sincronizar as threads do bloco. Como discutido acima, uma operação de barreira pode funcionar de modo que as threads de um bloco podem ser obrigadas a esperar até que todas as threads de um bloco tenham realizado a operação de barreira.
[0030] O sequenciador 208 pode ser configurado para gerir e programar a execução do código de dados paralelos dentre as unidades de computação 204. Por exemplo, o sequenciador 208 pode programar a execução dos blocos das threads e frentes de onda das threads nas unidades de computação 204. O sequenciador 208 também pode ser configurado para sincronizar blocos de threads. Por exemplo, o sequenciador 208 pode descarregar as threads a partir dos elementos de processamento 206 se essas threads tiverem realizado a operação de barreira e estiverem inativas enquanto esperam pelas outras threads de seu bloco realizarem suas respectivas operações de barreira para permitir que outras threads que estão esperando para executar sejam processadas pelos elementos de processamento 206. O sequenciador 208 também pode, mediante determinação de que todas as threads de um bloco realizaram as operações de barreira, recarregar as threads inativas de volta para os elementos de processamento 206.
[0031] O sequenciador 208 pode determinar dinamicamente uma largura de uma operação de barreira para um grupo de threads que está executando o mesmo código de dados paralelos em uma infinidade de pontos de dados com base no código de dados paralelos que deve ser executada pelas threads no grupo, onde a largura determinada é menor que o número total de threads no grupo. O grupo, em alguns exemplos, pode ser um bloco de threads. A largura de uma operação de barreira pode ser o número de threads em um bloco que deve alcançar a operação de barreira antes de qualquer das threads serem autorizadas a executar as operações subsequentes à operação de barreira. Porque a largura determinada é menor que o número total de threads no grupo, o sequenciador 208 pode, pela determinação de uma largura da barreira, permitir que as threads do grupo executem operações subsequentes às operações de barreira mesmo se nem toda thread no grupo tiver alcançado a respectiva operação de barreira.
[0032] O sequenciador 208 pode determinar a largura de uma operação de barreira para um grupo de threads com base no código de dados paralelos que deve ser executado pelas threads no grupo tanto antes da operação de barreira e/ou subsequente à operação de barreira. Por exemplo, com base no fragmento de código acima, o sequenciador 208 pode determinar que o código de dados paralelos irá escrever para 32 locais na matriz ptr antes da operação de barreira e que o código de dados paralelos irá ler a partir dos 32 locais na matriz ptr subsequente à operação de barreira. Portanto, o sequenciador pode determinar uma largura de barreira de 32 para a operação de barreira particular.
[0033] Em um exemplo, o sequenciador 208 pode armazenar as larguras de barreira determinadas dinamicamente das operações de barreira em um ou mais registradores de largura. Em resposta a uma thread alcançar a operação de barreira tendo sua largura de barreira armazenada em um registrador de largura, o número nos um ou mais registradores de largura é diminuído. Em resposta ao número nos um ou mais registradores de largura chegando a zero, quaisquer threads no bloco que estão esperando após terem alcançado a operação de barreira podem ser obrigadas a continuar a execução. Em outro exemplo, o sequenciador 208 pode incluir tanto um registrador de largura que armazena um número que indica uma largura de uma operação de barreira e um registrador em espera que armazena o número de threads que estão esperando por outras threads no bloco chegarem à barreira. Em resposta a uma thread alcançar a operação de barreira, o número no registrador em espera é aumentado. Em resposta ao número no registrador em espera ser igual ao número em um registrador de largura, quaisquer threads no bloco que estão esperando após alcançarem a operação de barreira podem ser obrigadas a continuar a execução.
[0034] Em alguns exemplos, determinar dinamicamente a largura da barreira pode permitir que desenvolvedores de programas de computador contendo código de dados paralelos escrevam mais facilmente código de dados paralelos de plataforma cruzada que pode funcionar através de uma variedade de sistemas de computação paralelos. Por exemplo, alguns sistemas de computação paralelos podem garantir que cada thread em uma frente de onda única pode funcionar simultaneamente, de modo que se a largura de uma barreira for menor do que a largura do vetor de uma frente de onda, então a operação de barreira é desnecessária. Por exemplo, se a largura do vetor para uma frente de onda é 16, como porque a unidade de computação contém 16 elementos de processamento, então as operações de barreira tendo larguras de barreira de 16 ou menos podem ser desnecessárias. No entanto, porque um programador de computador pode saber exatamente em qual sistema de computação paralelo seu código de dados paralelos irá funcionar e portanto pode não saber quantos elementos de processamento a unidade de computação para o sistema de processamento paralelo contém, se o programador de computador fixa no código uma largura de barreira que é menor do que a largura do vetor de uma frente de onda para um sistema de computação paralelo específico, então esse código de dados paralelos, quando executado nesse sistema de computação paralelo específico, pode realizar operações de barreira estranhas e pode retardar a execução do código de dados paralelos. Em contraste, o sequenciador 208 pode determinar uma largura de barreira para uma operação de barreira assim como a largura do vetor das frentes de onda para o sistema de computação paralelo específico, e pode determinar não realizar essa operação de barreira se a largura de barreira determinada for menor do que a largura do vetor da frente de onda para o sistema de computação paralelo no qual o código de dados paralelos funcionar Em alguns exemplos, o sequenciador 208 pode determinar larguras de barreira que são maiores que a largura do vetor das frentes de onda.
[0035] Calcular dinamicamente as larguras de barreira também pode permitir o uso de operações de barreira em sentenças condicionais do fluxo de controle dinâmico onde as sentenças condicionais não avaliam uniformemente em todo o grupo de threads. Considere o pseudocódigo a seguir:
[0036] Tipicamente, para um grupo de threads, se o condicional x<y não é avaliado como verdadeiro em cada thread, então incluindo a operação de barreira de modo que ela é realizada somente se o condicional x<y avalie como verdadeiro o que pode fazer com que o grupo de threads no grupo trave porque as threads onde x<y é avaliado como falso nunca irão realizar a operação de barreira. Em contraste, na presente divulgação, o sequenciador 208 pode dinamicamente definir uma largura da barreira como igual ao número de vezes que x<y é avaliado como verdadeiro, como pela pré-avaliação de x < y para o conjunto de valores x e y. Portanto, se a largura da barreira é definida como quatro, então as threads embarreiradas podem continuar após a barreira quando as quatro threads tiverem executado a operação de barreira sem ter que esperar pelo resto das threads no grupo dos itens de trabalho executem as operação de barreira.
[0037] O sequenciador 208 também pode determinar uma largura de barreira de uma operação de barreira para sincronizar juntos os subgrupos das threads onde as threads dos subgrupos são threads consecutivas de um bloco. Por exemplo, dado um bloco de dezesseis threads t0, t1, ... ,t15, se a largura da barreira para as operações de barreira das threads é especificado como quatro, então as primeiras quatro threads do bloco t0 a t3 podem sincronizar juntas, as segundas quatro threads do bloco t4 a t7 podem sincronizar juntas, o terceiro grupo de quatro threads t8 a t11 podem sincronizar juntas, e o quarto grupo de quatro threads t12 a t15 podem sincronizar juntas. Neste exemplo, cada thread no grupo de threads t0 a t3 pode somente ser obrigado a esperar que todas as threads t0 a t3 no grupo executem as operação de barreira antes de serem capazes de prosseguir sua execução, cada thread no grupo de threads t4 a t7 pode somente ser obrigado a esperar que todas as threads t4 a t7 no grupo executem a operação de barreira antes de serem capazes de prosseguir sua execução, cada thread no grupo de threads t8 a t11 pode somente ser obrigado a esperar que todas as threads t8 a t11 no grupo executem as operação de barreira antes de serem capazes de prosseguir sua execução, e cada thread no grupo de threads t12 a t15 pode somente ser obrigado a esperar que todas as threads t12 a t15 no grupo executem as operação de barreira antes de serem capazes de prosseguir sua execução. Portanto, por exemplo, se as threads t1, t8, t2 e t3 são as primeiras quatro threads a chegarem à operação de barreira, as threads t1, t2 e t3 podem ser obrigadas a esperar que a thread t4 chegue à operação de barreira antes dessas threads t2 e t3 serem obrigadas a continuar a execução após a operação de barreira, ainda que as quatro threads do bloco de dezesseis threads tenham chegado à operação de barreira.
[0038] A FIG. 3 é um diagrama conceitual que ilustra a sincronização de threads usando uma largura de barreira dinâmica de acordo com alguns aspectos da presente divulgação. Como mostrado na FIG. 3, um sequenciador, como o sequenciador 208 mostrado na FIG. 2, pode determinar que as threads 302 e 304 podem ser sincronizadas juntas, e que as threads 306 e 308 podem ser sincronizadas juntas. Assim, o sequenciador pode determinar uma largura de barreira de 2 para as threads 302, 304, 306, e 308 que podem executar o código de dados paralelos em paralelo. Portanto, as threads 302 e 304 são agrupadas em um subgrupo de threads, e as threads 306 e 308 podem ser agrupadas em outro subgrupo de threads. No momento t1, a thread 306 finalizou a execução de sua operação de escrita e chegou à operação de barreira 310. No entanto, porque nem toda thread em seu subgrupo também finalizou a execução de suas respectivas operações de escrita e chegou à operação de barreira, a thread 306 deve esperar até a outra thread (i.e., thread 308) no subgrupo também tenha finalizado a execução de sua operação de escrita e chegado à operação de barreira antes de avançar para a execução de uma operação de leitura subsequente à operação de barreira 310. No momento t2, a thread 302 finaliza a execução de uma operação de escrita e chega à operação de barreira 312. Da mesma forma, porque a thread 304, que é o outro membro do subgrupo com a thread 302, também ainda não finalizou a execução da operação de escrita e chegou à operação de barreira, a thread 302 também deve esperar antes de avançar para a execução do código subsequente à operação de barreira 312. No momento t3, a thread 304 chega à operação de barreira 314. Porque ambas as threads 302 e 304 chegaram às operações de barreira 312 e 314, as threads 302 e 304 podem prosseguir para executar as respectivas operações de leitura subsequentes à operação de barreira 314. No momento t4, a thread 308 chega à operação de barreira 316. Porque ambas as threads 306 e 308 chegaram à operação de barreira, as threads 306 e 308 não são permitidas a executar as respectivas operações de leitura subsequentes às suas respectivas operações de barreira. Como pode ser visto na FIG. 3, pela definição de uma largura de barreira que é menor do que o número total de threads em um grupo de threads, as threads podem ser capazes de continuar a execução após a barreira muito mais rapidamente. Por exemplo, ao não definir uma largura de barreira que é menor que o número total de threads em um grupo de threads, as threads 302, 304, e 306 permaneceriam inativas após executar as respectivas operações de barreira 310, 312, e 314, até a thread 308 executar a operação de barreira 316 no momento t4, que é posterior aos momentos t1, t2, e t3.
[0039] Determinar dinamicamente a largura de uma operação de barreira pode ser útil em uma redução paralela, especialmente quando o tamanho de um conjunto de números a ser reduzido não é conhecido até o momento da execução. Uma redução é uma técnica para somar um conjunto de números, e uma redução paralela pode ser uma redução onde o código de dados paralelos pode funcionar para somar os elementos da redução em paralelo. A FIG. 4 é um diagrama conceitual que ilustra uma redução paralela exemplar de acordo com alguns aspectos da presente divulgação. Como mostrado na FIG. 4, a matriz 402 pode incluir um conjunto de oito números a serem somados. O código de dados paralelos para realizar a redução pode funcionar de modo que cada item de trabalho soma dois elementos consecutivos da matriz 402 juntos. Assim, em uma primeira passagem da redução paralela, as operações de soma 404A-404D ("operações de soma 404") podem executar em paralelo através de quatro threads paralelas para cada soma de dois dos elementos da matriz 402 para reduzir a matriz de oito elementos 402 para uma matriz de quatro elementos 406 contendo as quatro somas resultantes de cada uma das operações de soma 404.
[0040] No entanto, porque o tamanho do conjunto pode ser desconhecido no momento da execução, pode ser impossível para um programador conhecer durante a compilação a largura de barreira exata necessária para operações de barreira no código de dados paralelos para realizar a redução paralela. Por exemplo, o tamanho do conjunto pode depender da entrada do usuário, de modo que um usuário pode inserir 8 números, 20 números, ou quaisquer outras definições de números. No exemplo específico mostrado na FIG. 4, um sequenciador, como o sequenciador 208 mostrado na FIG. 2, pode determinar com base no tamanho (8) da matriz 402, uma largura de barreira de 4 para as operações de barreira a serem realizadas pelas quatro threads subsequentes para realizar as operações de soma 404.
[0041] O primeiro round de redução através de operações de soma 404 pode produzir a matriz 406 contendo quatro elementos resultantes. Para reduzir ainda mais os elementos da matriz 406, somente duas threads podem ser necessárias para realizar as operações de soma 408A e 408B ("operações de soma 408"). Portanto, o sequenciador pode determinar que com base no tamanho (4) da matriz 406, uma largura de barreira de 2 para as operações de barreira a serem realizadas pelas duas threads subsequentes à realização das operações de soma 408.
[0042] O segundo round da redução através das operações de soma 408 pode produzir a matriz 410 contendo dois elementos resultantes. Para reduzir ainda mais os elementos da matriz 410, somente uma única thread pode ser necessária para realizar a operação de soma 412. Portanto, o sequenciador pode determinar que a operação de barreira não precisa ser realizada. Portanto, o sequenciador pode determinar ignorar a operação de barreira especificada no código após realizar a operação de soma 412.
[0043] O código de dados paralelos para realizar a redução da soma é tipicamente escrito como um loop, de modo que a operação de barreira seja incluída dentro do loop. Portanto, se a largura da operação de barreira deve ser definida durante a compilação, assumindo que o programador sabe o número inicial de elementos no conjunto para reduzir, o programador pode ter que desenrolar o loop para inserir manualmente as operações de barreira de uma largura específica após cada conjunto de operações de soma. Em contraste, no exemplo atual, o sintetizador pode determinar dinamicamente a largura da barreira para cada repetição da operação de barreira.
[0044] FIG. 5 é um diagrama de fluxo que ilustra um processo exemplar de sincronização das threads usando uma barreira dinâmica de acordo com alguns aspectos da presente divulgação. Como mostrado na FIG. 5, um sequenciador, como sequenciador 208 mostrado na FIG. 2, pode determinar dinamicamente, no momento da execução de um aplicativo de computador em execução em um hospedeiro, como hospedeiro 220 mostrado na FIG. 2, que inclui código de dados paralelo seja executado por uma unidade de processamento, como unidade de processamento 202 mostrado na FIG. 2, operacionalmente acoplada ao hospedeiro, uma largura de barreira de uma operação de barreira para um grupo de threads em que cada uma executa o código de dados paralelos, sendo que a largura da barreira é menor do que um número total de threads no grupo de threads (502). No exemplo da FIG. 5, o grupo de threads pode incluir 64 threads, e o sequenciador pode determinar uma largura de barreira de 32. Portanto, as 64 threads podem incluir dois subgrupos de 32 threads cada, onde as threads de um subgrupo são sincronizadas com as outras threads daquele mesmo subgrupo. Em um primeiro momento, uma primeira thread do primeiro subgrupo do grupo de threads pode alcançar a barreira (504) e pode esperar que o resto das threads do primeiro subgrupo também alcancem a barreira. Em um segundo momento, uma primeira thread do segundo subgrupo do grupo de threads pode chegar à barreira (506) e pode esperar que o resto das threads do segundo subgrupo também alcance a barreira.
[0045] Em um terceiro momento, todas as threads do primeiro subgrupo podem chegar à barreira (508). O sequenciador pode, em resposta à cada thread no primeiro subgrupo do grupo de threads que executou as respectivas operações de barreira, o primeiro subgrupo incluindo um mesmo número de threads como a largura de barreira determinada, permitir que o primeiro subgrupo do grupo de threads funcione nas uma ou mais unidades de computação subsequentes às respectivas operações de barreira sem esperar por outras threads no grupo de threads executarem operações de barreira, sendo que o primeiro subgrupo do grupo de threads é menor que o número total de threads no grupo de threads (510).
[0046] Em um quarto momento, todas as threads do segundo subgrupo podem chegar à barreira (512). O sequenciador pode, em resposta à cada thread no segundo subgrupo do grupo de threads que executou as respectivas operações de barreira, o segundo subgrupo incluindo um mesmo número de threads como a largura de barreira determinada, permitir que o segundo subgrupo do grupo de threads funcione nas uma ou mais unidades de computação subsequentes às respectivas operações de barreira sem esperar por outras threads no grupo de threads executarem operações de barreira, sendo que o segundo subgrupo do grupo de threads é menor que o número total de threads no grupo de threads (514).
[0047] Em alguns exemplos, determinar a largura da barreira pode incluir determinar a largura da barreira da operação de barreira com base pelo menos em parte no código de dados paralelos. Em alguns exemplos, a largura da barreira da operação de barreira é maior do que uma largura do vetor de uma frente de onda de um ou mais processadores. Em alguns exemplos, o sequenciador pode ainda determinar não realizar a operação de barreira se a largura da barreira da operação de barreira for menor do que a largura do vetor de uma frente de onda para as uma ou mais processadores. Em alguns exemplos, a operação de barreira é incluída em uma sentença condicional, e a sentença condicional não avalia uniformemente através de todo o grupo de threads. Em alguns exemplos, as threads no subgrupo do grupo de threads são threads consecutivas no grupo de threads. Em alguns exemplos, a operação de barreira está incluída em um loop. Em alguns exemplos, o sequenciador pode determinar dinamicamente a largura da barreira da operação de barreira para cada repetição do loop, sendo que a largura de barreira determinada é diferente em pelo menos duas repetições do loop.
[0048] A FIG. 6 é um diagrama em bloco que ilustra um exemplo de um dispositivo que pode ser configurado para implementar um ou mais aspectos desta divulgação. Por exemplo, a FIG. 6 ilustra o dispositivo 602. Os exemplos do dispositivo 602 incluem, entre outros, dispositivos de vídeo, reprodutores de mídia, decodificadores, aparelhos sem fio, como telefones celulares e os chamados smartphones, assistentes pessoais digitais (PDAs), computadores desktop, computadores portáteis, consoles de jogos, unidades de videoconferência, dispositivos de computação tablet, e assim por diante.
[0049] No exemplo da FIG. 6, o dispositivo 602 pode incluir o hospedeiro 610, memória do sistema 618, e unidade de processamento 620. O hospedeiro 610 pode ser similar ao hospedeiro 220 mostrado na FIG. 2, e a unidade de processamento 620 pode ser similar à unidade de processamento 202 mostrada na FIG. 2. Para fins de brevidade, o hospedeiro 610, memória do sistema 618, e unidade de processamento 620 não são adicionalmente descritos com relação à FIG. 6. O dispositivo 622 também pode incluir processador de exibição 624, módulo transceptor 626, interface de usuário 628, e monitor 630. O módulo transceptor 626 e processador de exibição 624 podem ambos se parte do mesmo circuito integrado (IC) como hospedeiro 610 e/ou unidade de processamento 620, podem ambos ser externos ao IC ou ICs que incluem o hospedeiro 610 e/ou unidade de processamento 620, ou podem ser formados no IC que é externo ao IC que inclui o hospedeiro 610 e/ou unidade de processamento 620.
[0050] O dispositivo 622 pode incluir módulos ou unidades adicionais não mostradas na FIG. 6 para fins de clareza. Por exemplo, o dispositivo 622 pode incluir um alto-falante e um microfone, nenhum dos quais é mostrado na FIG. 6, para efetuar comunicações telefônicas nos exemplos onde o dispositivo 622 é um telefone sem fio móvel, ou um alto-falante onde o dispositivo 622 é um reprodutor de mídia. O dispositivo 622 também pode incluir uma câmera de vídeo. Além disso, os vários módulos e unidades mostrados no dispositivo 622 podem não ser necessários em cada exemplo do dispositivo 622. Por exemplo, a interface de usuário 628 e monitor 630 podem ser externos ao dispositivo 622 nos exemplos onde o dispositivo 622 é um computador desktop ou outro dispositivo que é equipado para fazer a interface com uma interface de usuário ou monitor externos.
[0051] Exemplos de interface de usuário 628 incluem, entre outros, uma trackball, um mouse, um teclado, e outros tipos de dispositivos de entrada. A interface de usuário 628 também pode ser uma tela sensível ao toque e pode ser incorporada como uma parte do monitor 630. O módulo transceptor 626 pode incluir circuitos para permitir a comunicação com ou sem fio entre o dispositivo 622 e outro dispositivo ou uma rede. O módulo transceptor 626 pode incluir moduladores, demoduladores, amplificadores e outro desses circuitos para a comunicação com ou sem fio.
[0052] Em alguns exemplos, a unidade de processamento 620 pode ser uma GPU que pode armazenar uma imagem completamente formada na memória do sistema 618. O processador de exibição 624 pode recuperar a imagem a partir da memória do sistema 618 e produzir valores que fazem com que os pixels do monitor 630 se iluminem para exibir a imagem. O monitor 630 pode ser o monitor do dispositivo 622 que exibe o conteúdo de imagem gerado pela unidade de processamento 620. O monitor 630 pode ser um monitor de cristal líquido (LCD), um monitor de diodo orgânico emissor de luz (OLED), um monitor de tubo de raios catódicos (CRT), um monitor de plasma, ou outro tipo de dispositivo de exibição.
[0053] Em um ou mais exemplos, as funções descritas podem ser implementadas em hardware, software, firmware, ou qualquer combinação dos mesmos. Se implementadas em software, as funções podem ser armazenadas em ou transmitidas sobre as uma ou mais instruções ou código em um meio legível por computador. A mídia legível por computador pode incluir mídia de armazenamento de dados de computador. A mídia de armazenamento de dados pode ser qualquer mídia disponível que pode ser acessada por um ou mais computadores ou um ou mais processadores para recuperar as instruções, código e/ou estruturas de dados para implementação das técnicas descritas nesta divulgação. Por meio de exemplo e não limitação, tal mídia legível por computador pode compreender RAM, ROM, EEPROM, CD-ROM ou outro armazenamento em disco ótico, armazenamento em disco magnético ou outros dispositivos de armazenamento magnético, ou qualquer outro meio que pode ser utilizado para transportar ou armazenar o código de programa desejado sob a forma de instruções ou estruturas de dados e que pode ser acessado por um computador. O software armazenado na mídia de armazenamento de dados pode ser transmitido a partir de um site, servidor, ou outra fonte remota usando um cabo coaxial, cabo de fibra ótica, par trançado, linha de assinante digital (DSL) ou tecnologias sem fio, como infravermelho, rádio, e micro-ondas, em seguida, o cabo coaxial, cabo de fibra ótica, par trançado, DSL ou tecnologias sem fio, como infravermelho, rádio, e micro-ondas são incluídos na definição de meio. Disquete e disco, como usados aqui, incluem disco compacto (CD), disco a laser, disco ótico, disco versátil digital (DVD), disquete e disco Blu-ray onde disquetes geralmente reproduzem dados magneticamente, enquanto que os discos reproduzem dados oticamente com lasers. Combinações dos acima também devem ser incluídas dentro do escopo de mídia legível por computador.
[0054] O código pode ser executado por um ou mais processadores, como um ou mais processadores de sinal digital (DSPs), microprocessadores de uso geral, circuitos integrados de aplicação específica (ASIC), arranjos de portas programáveis em campo (FPGAs), ou outros circuitos integrados ou de lógica discreta equivalentes. Assim, o termo "processador," como usado aqui pode se referir a qualquer uma das estruturas anteriores ou qualquer outra estrutura adequada para aplicação das técnicas aqui descritas. Além disso, em alguns aspectos, a funcionalidade descrita aqui pode ser fornecida dentro dos módulos de hardware e/ou software dedicados. Além disso, as técnicas podem ser totalmente implementadas em um ou mais circuitos ou elementos lógicos.
[0055] As técnicas desta divulgação podem ser implementadas em uma ampla variedade de dispositivos ou aparelhos, incluindo e um telefone sem fio, um circuito integrado (IC) ou um conjunto de ICs (isto é, um conjunto de chips). Vários componentes, módulos ou unidades são descritos nesta divulgação para enfatizar os aspectos funcionais dos dispositivos configurados para executar as técnicas divulgadas, mas que não precisam necessariamente da realização por diferentes unidades de hardware. De preferência, como descrito acima, várias unidades podem ser combinadas em uma unidade de hardware de codec ou fornecida por um conjunto de unidades de hardware interoperativas, incluindo um ou mais processadores como descrito acima, em conjunto com o software e/ou firmware apropriado.
[0056] Vários exemplos foram descritos. Estes e outros exemplos estão dentro do escopo das reivindicações a seguir.
Claims (13)
1. Método para sincronizar threads em um grupo de threads, em que cada thread executa o código de dados paralelos em uma ou mais unidades de computação (204) de uma unidade de processamento (202) operacionalmente acopladda a um hospedeiro, em que as uma ou mais unidades de computação compreendem, cada uma, uma pluralidade de elementos de processamento (206), e em que as threads do grupo de threads estão agrupadas em uma ou mais frentes de onda, cada frente de onda contendo mais ou menos threads tal como há elementos de processamento em uma única frente de onda de modo que elementos de processamento de uma única unidade de computação podem processar simultaneamente cada thread em uma frente de onda, o método caracterizado por compreender: determinar, durante a execução de um aplicativo em execução em um hospedeiro, uma largura de barreira de uma operação de barreira para um grupo de threads, em que a largura de barreira especifica uma quantidade de threads em um subgrupo das threads, em que a execução das threads do subgrupo deve ser sincronizada, e em que a largura da barreira é menor do que um número total de threads no grupo de threads; para um subgrupo de um grupo de threads: determinar a não realização da operação de barreira se a largura de barreira da operação de barreira for menor do que uma quantidade de threads em uma frente de onda, e simultaneamente processar as threads no subgrupo em uma única frente de onda; e se a largura de barreira da operação de barreira for maior do que uma quantidade de threads em uma frente de onda, em resposta à cada thread no subgrupo que executou as respectivas operações de barreira, permitindo que as threads no subgrupo executem respectivas operações nas uma ou mais unidades de computação subsequentes às respectivas operações de barreira sem esperar por outras threads no grupo de threads executarem operações de barreira.
2. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que a determinação compreende: determinar a largura da barreira da operação de barreira com base pelo menos em parte no código de dados paralelos.
3. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que a operação de barreira está incluída em um ramo de uma sentença condicional, e em que a sentença condicional não avalia uniformemente através do grupo de threads.
4. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que as threads no subgrupo do grupo de threads são índices de thread consecutivos no grupo de threads.
5. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que a operação de barreira está incluída dentro de um loop.
6. Método, de acordo com a reivindicação 5, caracterizado pelo fato de que compreende adicionalmente: determinar dinamicamente a largura da barreira da operação de barreira para cada iteração do loop, em que a largura de barreira determinada é diferente em pelo menos duas iterações do loop.
7. Sistema de computação para sincronizar threads em um grupo de threads, em que cada thread executa o código de dados paralelos em uma ou mais unidades de computação (204) de uma unidade de processamento (202) operacionalmente acoplada ao hospedeiro, em que as uma ou mais unidades de computação compreendem, cada uma, uma pluralidade de elementos de processamento (206), e em que as threads do grupo de threads estão agrupadas em uma ou mais frentes de onda, cada frente de onda contendo mais ou menos threads tal como há elementos de processamento em uma única frente de onda de modo que elementos de processamento de uma única unidade de computação podem processar simultaneamente cada thread em uma frente de onda, o sistema que compreende: um hospedeiro; uma unidade de processamento (202) operacionalmente acoplada ao hospedeiro; o sistema caracterizado pelo fato de que compreende: um módulo sequenciador configurado para: determinar, durante a execução de um aplicativo em execução no hospedeiro, uma largura de barreira de uma operação de barreira para um grupo de threads, em que a largura de barreira especifica uma quantidade de threads em um subgrupo das threads, em que a execução das threads do subgrupo deve ser sincronizada, e em que a largura da barreira é menor do que um número total de threads no grupo de threads, e para um subgrupo de um grupo de threads: determinar a não realização da operação de barreira se a largura de barreira da operação de barreira for menor do que uma quantidade de threads em uma frente de onda, e simultaneamente processar as cadeias no subgrupo em uma única frente de onda; e se a largura de barreira da operação de barreira for maior do que uma quantidade de threads em uma frente de onda, em resposta à cada thread no subgrupo que executou as respectivas operações de barreira, permitir que as threads no subgrupo executem respectivas operações nas uma ou mais unidades de computação subsequentes às respectivas operações de barreira sem esperar por outras threads no grupo de threads executarem operações de barreira.
8. Sistema de computação, de acordo com a reivindicação 7, caracterizado pelo fato de que determinar a largura da barreira compreende:determinar a largura da barreira da operação de barreira com base pelo menos em parte no código de dados paralelos.
9. Sistema de computação, de acordo com a reivindicação 7, caracterizado pelo fato de que a operação de barreira está incluída em uma sentença condicional, e em que a sentença condicional não avalia uniformemente através do grupo de threads.
10. Sistema de computação, de acordo com a reivindicação 7, caracterizado pelo fato de que as threads no subgrupo do grupo de threads são índices de thread consecutivos no grupo de threads.
11. Sistema de computação, de acordo com a reivindicação 7, caracterizado pelo fato de que a operação de barreira está incluída dentro de um loop.
12. Sistema de computação, de acordo com a reivindicação 11, caracterizado pelo fato de que o módulo sequenciador é configurado adicionalmente para:determinar dinamicamente a largura de barreira da operação de barreira para cada iteração do loop, em que a largura de barreira determinada é diferente em pelo menos duas iterações do loop.
13. Memória legível por computador caracterizada pelo fato de que compreende instruções armazenadas na mesma, as instruções que quando executadas por computador realizam as etapas do método conforme definido em qualquer uma das reivindicações 1 a 6.
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US13/965,818 US9218223B2 (en) | 2013-08-13 | 2013-08-13 | Barrier synchronization with dynamic width calculation |
US13/965,818 | 2013-08-13 | ||
PCT/US2014/050143 WO2015023509A1 (en) | 2013-08-13 | 2014-08-07 | Barrier synchronization with dynamic width calculation |
Publications (3)
Publication Number | Publication Date |
---|---|
BR112016002637A2 BR112016002637A2 (pt) | 2017-08-01 |
BR112016002637A8 BR112016002637A8 (pt) | 2022-08-23 |
BR112016002637B1 true BR112016002637B1 (pt) | 2023-03-14 |
Family
ID=51422147
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
BR112016002637-3A BR112016002637B1 (pt) | 2013-08-13 | 2014-08-07 | Método e sistema de computação para sincronizar threads em um grupo de threads, e memória legível por computador |
Country Status (8)
Country | Link |
---|---|
US (1) | US9218223B2 (pt) |
EP (2) | EP3033679A1 (pt) |
JP (1) | JP6130065B2 (pt) |
KR (1) | KR101724247B1 (pt) |
CN (1) | CN105453045B (pt) |
BR (1) | BR112016002637B1 (pt) |
CA (1) | CA2917609C (pt) |
WO (1) | WO2015023509A1 (pt) |
Families Citing this family (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9916162B2 (en) * | 2013-12-26 | 2018-03-13 | Intel Corporation | Using a global barrier to synchronize across local thread groups in general purpose programming on GPU |
DE102016203965A1 (de) * | 2016-03-10 | 2017-09-14 | Robert Bosch Gmbh | Überwachung eines Rechensystems |
US10324730B2 (en) * | 2016-03-24 | 2019-06-18 | Mediatek, Inc. | Memory shuffle engine for efficient work execution in a parallel computing system |
US10223436B2 (en) * | 2016-04-27 | 2019-03-05 | Qualcomm Incorporated | Inter-subgroup data sharing |
US20170357705A1 (en) * | 2016-06-08 | 2017-12-14 | Knuedge Incorporated | Performing a synchronization operation on an electronic device |
US10318355B2 (en) * | 2017-01-24 | 2019-06-11 | Oracle International Corporation | Distributed graph processing system featuring interactive remote control mechanism including task cancellation |
US11353868B2 (en) | 2017-04-24 | 2022-06-07 | Intel Corporation | Barriers and synchronization for machine learning at autonomous machines |
US10990453B2 (en) * | 2018-04-12 | 2021-04-27 | Advanced Micro Devices, Inc. | Improving latency by performing early synchronization operations in between sets of program operations of a thread |
GB2574817B (en) * | 2018-06-18 | 2021-01-06 | Advanced Risc Mach Ltd | Data processing systems |
JP7159696B2 (ja) * | 2018-08-28 | 2022-10-25 | 富士通株式会社 | 情報処理装置,並列計算機システムおよび制御方法 |
US11449339B2 (en) * | 2019-09-27 | 2022-09-20 | Red Hat, Inc. | Memory barrier elision for multi-threaded workloads |
US11409579B2 (en) * | 2020-02-24 | 2022-08-09 | Intel Corporation | Multiple independent synchonization named barrier within a thread group |
KR102501187B1 (ko) * | 2020-04-03 | 2023-02-17 | 서울대학교산학협력단 | 배리어 구현 방법 및 시스템 |
US11461130B2 (en) | 2020-05-26 | 2022-10-04 | Oracle International Corporation | Methodology for fast and seamless task cancelation and error handling in distributed processing of large graph data |
US11204774B1 (en) * | 2020-08-31 | 2021-12-21 | Apple Inc. | Thread-group-scoped gate instruction |
GB2604150B (en) * | 2021-02-26 | 2023-06-14 | Advanced Risc Mach Ltd | Data processing systems |
US12045668B2 (en) * | 2021-04-22 | 2024-07-23 | EMC IP Holding Company, LLC | System and method for efficient snapshots barrier mechanism for system with presorted container-based log |
US20230205608A1 (en) * | 2021-12-27 | 2023-06-29 | Advanced Micro Devices, Inc. | Hardware supported split barrier |
Family Cites Families (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6574725B1 (en) | 1999-11-01 | 2003-06-03 | Advanced Micro Devices, Inc. | Method and mechanism for speculatively executing threads of instructions |
JP3571976B2 (ja) | 1999-11-08 | 2004-09-29 | 富士通株式会社 | デバッグ装置及び方法並びにプログラム記録媒体 |
US7512950B1 (en) | 2003-08-14 | 2009-03-31 | Sun Microsystems, Inc. | Barrier synchronization object for multi-threaded applications |
JP4276028B2 (ja) * | 2003-08-25 | 2009-06-10 | 株式会社日立製作所 | マルチプロセッサシステムの同期方法 |
US7937709B2 (en) * | 2004-12-29 | 2011-05-03 | Intel Corporation | Synchronizing multiple threads efficiently |
US7865911B2 (en) * | 2005-11-08 | 2011-01-04 | Microsoft Corporation | Hybrid programming |
US7555607B2 (en) | 2005-11-10 | 2009-06-30 | Hewlett-Packard Development Company, L.P. | Program thread syncronization for instruction cachelines |
US8484516B2 (en) * | 2007-04-11 | 2013-07-09 | Qualcomm Incorporated | Inter-thread trace alignment method and system for a multi-threaded processor |
US8966488B2 (en) | 2007-07-06 | 2015-02-24 | XMOS Ltd. | Synchronising groups of threads with dedicated hardware logic |
US8866827B2 (en) * | 2008-06-26 | 2014-10-21 | Microsoft Corporation | Bulk-synchronous graphics processing unit programming |
JP5239751B2 (ja) * | 2008-10-31 | 2013-07-17 | 富士通株式会社 | ノード間同期装置、ノード間同期方法およびノード間同期プログラム |
JP5447807B2 (ja) * | 2009-08-07 | 2014-03-19 | 株式会社日立製作所 | バリア同期方法及び計算機 |
US8539204B2 (en) | 2009-09-25 | 2013-09-17 | Nvidia Corporation | Cooperative thread array reduction and scan operations |
-
2013
- 2013-08-13 US US13/965,818 patent/US9218223B2/en active Active
-
2014
- 2014-08-07 CA CA2917609A patent/CA2917609C/en not_active Expired - Fee Related
- 2014-08-07 EP EP14756161.7A patent/EP3033679A1/en not_active Ceased
- 2014-08-07 EP EP21192792.6A patent/EP3964951A1/en active Pending
- 2014-08-07 KR KR1020167006600A patent/KR101724247B1/ko active IP Right Grant
- 2014-08-07 JP JP2016524424A patent/JP6130065B2/ja active Active
- 2014-08-07 CN CN201480043435.2A patent/CN105453045B/zh active Active
- 2014-08-07 WO PCT/US2014/050143 patent/WO2015023509A1/en active Application Filing
- 2014-08-07 BR BR112016002637-3A patent/BR112016002637B1/pt active IP Right Grant
Also Published As
Publication number | Publication date |
---|---|
CN105453045A (zh) | 2016-03-30 |
CA2917609A1 (en) | 2015-02-19 |
JP2016525746A (ja) | 2016-08-25 |
WO2015023509A1 (en) | 2015-02-19 |
JP6130065B2 (ja) | 2017-05-17 |
US9218223B2 (en) | 2015-12-22 |
KR101724247B1 (ko) | 2017-04-06 |
EP3964951A1 (en) | 2022-03-09 |
CA2917609C (en) | 2017-10-24 |
BR112016002637A8 (pt) | 2022-08-23 |
EP3033679A1 (en) | 2016-06-22 |
KR20160036067A (ko) | 2016-04-01 |
US20150052537A1 (en) | 2015-02-19 |
CN105453045B (zh) | 2017-04-12 |
BR112016002637A2 (pt) | 2017-08-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
BR112016002637B1 (pt) | Método e sistema de computação para sincronizar threads em um grupo de threads, e memória legível por computador | |
US9430807B2 (en) | Execution model for heterogeneous computing | |
JP6329274B2 (ja) | コンパイラ最適化のためのメモリ参照メタデータ | |
US8972698B2 (en) | Vector conflict instructions | |
US11900113B2 (en) | Data flow processing method and related device | |
US20140157287A1 (en) | Optimized Context Switching for Long-Running Processes | |
US9977663B2 (en) | Technologies for optimizing sparse matrix code with field-programmable gate arrays | |
JP6952138B2 (ja) | チップに基づく計算機能を生成する方法、装置、デバイス、および記憶媒体 | |
CN108021563B (zh) | 一种指令间数据依赖的检测方法和装置 | |
US10295596B1 (en) | Method and system for generating validation tests | |
Yang et al. | An approach to build cycle accurate full system VLIW simulation platform | |
US11853762B1 (en) | Single instruction multiple data execution with variable size logical registers | |
US10996960B1 (en) | Iterating single instruction, multiple-data (SIMD) instructions | |
US11231935B2 (en) | Vectorized sorted-set intersection using conflict-detection SIMD instructions | |
US11687344B2 (en) | Method and system for hard ware-assisted pre-execution | |
Wu et al. | Research on OpenMP model of the parallel programming technology for homogeneous multicore DSP | |
US11593114B1 (en) | Iterating group sum of multiple accumulate operations | |
US9489246B2 (en) | Method and device for determining parallelism of tasks of a program | |
US20150082443A1 (en) | System to automate compliance with licenses of software third-party content | |
US20130173682A1 (en) | Floating-point error propagation in dataflow | |
US20230333825A1 (en) | Control of storage aliasing via automatic application of artificial dependences during program compilation | |
Mytkowicz et al. | Waiting for Godot? the right language abstractions for parallel programming should be here soon: the multicore transformation (Ubiquity symposium) | |
Li et al. | A dual-buffer based Acceleration Strategy for FW Block Algorithm on GPUS | |
Mytkowicz | The Multicore Transformation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
B06U | Preliminary requirement: requests with searches performed by other patent offices: procedure suspended [chapter 6.21 patent gazette] | ||
B15K | Others concerning applications: alteration of classification |
Free format text: A CLASSIFICACAO ANTERIOR ERA: G06F 9/52 Ipc: G06F 9/52 (2006.01), G06F 9/38 (2006.01), G06F 9/3 |
|
B06A | Patent application procedure suspended [chapter 6.1 patent gazette] | ||
B09A | Decision: intention to grant [chapter 9.1 patent gazette] | ||
B16A | Patent or certificate of addition of invention granted [chapter 16.1 patent gazette] |
Free format text: PRAZO DE VALIDADE: 20 (VINTE) ANOS CONTADOS A PARTIR DE 07/08/2014, OBSERVADAS AS CONDICOES LEGAIS |
|
B16C | Correction of notification of the grant [chapter 16.3 patent gazette] |
Free format text: REFERENTE A RPI 2723 DE 14/03/2023, QUANTO AO ITEM (73) CIDADANIA. |