BR112018015857B1 - Ajuste da taxa de clock baseado em quadro para unidade de processamento - Google Patents

Ajuste da taxa de clock baseado em quadro para unidade de processamento Download PDF

Info

Publication number
BR112018015857B1
BR112018015857B1 BR112018015857-7A BR112018015857A BR112018015857B1 BR 112018015857 B1 BR112018015857 B1 BR 112018015857B1 BR 112018015857 A BR112018015857 A BR 112018015857A BR 112018015857 B1 BR112018015857 B1 BR 112018015857B1
Authority
BR
Brazil
Prior art keywords
gpu
frame
time
clock rate
instance
Prior art date
Application number
BR112018015857-7A
Other languages
English (en)
Other versions
BR112018015857A2 (pt
Inventor
Qiao Shen
Song Zhao
Navid Farazmand
Eduardus Antonius Metz
Original Assignee
Qualcomm Incorporated
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from US15/014,727 external-priority patent/US9817431B2/en
Application filed by Qualcomm Incorporated filed Critical Qualcomm Incorporated
Publication of BR112018015857A2 publication Critical patent/BR112018015857A2/pt
Publication of BR112018015857B1 publication Critical patent/BR112018015857B1/pt

Links

Abstract

Técnicas são descritas em que um processador determina o quanto está ocupada uma unidade de processamento gráfico (GPU) estava em renderizar uma fama atual com base em um intervalo de tempo entre quando a GPU completava a renderização do frame atual e quando a GPU completava a renderização de um frame anterior que precede imediatamente o frame atual. O processador define uma taxa de clock da GPU com base na determinação de quão ocupada a GPU estava na renderização do frame atual.

Description

CAMPO TÉCNICO
[0001] A presente invenção refere-se ao ajuste da taxa de clock e, mais particularmente, ao ajuste da taxa de clock de uma unidade de processamento gráfico (GPU).
ANTECEDENTES
[0002] Os dispositivos móveis são alimentados por baterias de tamanho e / ou capacidade limitada. Normalmente, os dispositivos móveis são usados para fazer chamadas telefônicas, verificar e-mails, gravar / reproduzir uma foto / vídeo, ouvir rádio, navegar, navegar, jogar, gerenciar dispositivos e realizar cálculos, entre outras coisas. Muitas dessas ações utilizam uma unidade de processamento gráfico (GPU) para executar algumas tarefas. Exemplos de tarefas de GPU incluem a renderização de conteúdo para uma exibição e a execução de cálculos gerais de computação (por exemplo, em uma operação de GPU de propósito geral (GPGPU)). Portanto, a GPU é normalmente um grande consumidor de energia em dispositivos móveis. Como tal, é benéfico gerenciar o consumo de energia da GPU para prolongar a vida da bateria.
SUMÁRIO
[0003] Em geral, a presente invenção descreve técnicas para ajustar proativamente uma frequência de um sinal de clock de uma unidade de processamento gráfico (GPU). Em alguns exemplos, uma unidade de processamento central (CPU) determina um intervalo de tempo entre o momento em que a GPU concluiu a renderização de um quadro e quando a GPU concluiu a renderização do quadro imediatamente anterior. A CPU também determina o quanto está ocupada a GPU estava durante esse intervalo de tempo e determina a frequência do sinal de clock da GPU com base na determinação de quão ocupada a GPU estava durante o intervalo de tempo. Deste modo, a CPU pode determinar rapidamente a frequência do sinal de clock com base no nível de ocupação para um único quadro em vez de esperar que múltiplos quadros sejam processados antes de determinar a frequência do sinal de clock.
[0004] Em um exemplo, a presente invenção descreve um método de determinação de frequência que compreende determinar, com um processador, uma primeira instância de tempo quando uma unidade de processamento gráfico (GPU) completa renderizando um primeiro quadro, determinando, com o processador, uma segunda instância de tempo quando A GPU concluiu renderizando um segundo quadro que precede imediatamente o primeiro quadro, determinando, com o processador, um intervalo de tempo baseado na primeira instância de tempo e na segunda instância de tempo, determinando, com o processador, um nível de ocupação da GPU para renderização o primeiro quadro durante o intervalo de tempo e a definição de uma taxa de clock da GPU com base no nível de ocupação determinado.
[0005] Em um exemplo, a presente invenção descreve um dispositivo para determinação de frequência de clock compreendendo memória configurada para armazenar dados gráficos que são usados por uma unidade de processamento gráfico (GPU) para renderizar um primeiro quadro e um segundo quadro, e um processador compreendendo circuitos integrados, configurado para determinar uma primeira instância de tempo quando a GPU concluiu a renderização do primeiro quadro, determinar uma segunda instância de tempo quando a GPU concluiu a renderização do segundo quadro, determinar um intervalo de tempo baseado na primeira instância de tempo e a segunda instância de tempo, determinar um nível de ocupação da GPU para renderizar o primeiro quadro durante o intervalo de tempo e definir uma taxa de clock da GPU com base no nível de ocupação determinado.
[0006] Em um exemplo, a presente invenção descreve um meio de armazenamento não transitório legível por computador que armazena instruções que, quando executadas, fazem com que um ou mais processadores determinem uma primeira instância de tempo quando uma unidade de processamento gráfico (GPU) completa a renderização do primeiro quadro, determine uma segunda instância de tempo quando a GPU conclui a renderização de um segundo quadro que precede imediatamente o primeiro quadro, determina um intervalo de tempo baseado na primeira ocorrência de tempo e na segunda instância de tempo, determina um nível de ocupação da GPU para renderizar o primeiro quadro durante o intervalo de tempo e defina uma taxa de clock da GPU com base no nível de ocupação determinado.
[0007] Em um exemplo, a presente invenção descreve um dispositivo para determinação de taxa de clock compreendendo meios para determinar uma primeira instância de tempo quando uma unidade de processamento gráfico (GPU) completou a renderização de um primeiro quadro, meios para determinar uma segunda instância de tempo quando a GPU renderiza um segundo quadro que precede imediatamente o primeiro quadro, meios para determinar um intervalo de tempo baseado na primeira instância e a segunda instância, meios para determinar um nível de ocupação da GPU para renderizar o primeiro quadro durante o intervalo de tempo e meios para configurar uma taxa de clock da GPU com base no nível de ocupação determinado.
[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, desenhos e reivindicações.
BREVE DESCRIÇÃO DOS DESENHOS
[0009] A figura 1 é um diagrama de blocos que ilustra um exemplo de dispositivo para processar dados de acordo com uma ou mais técnicas de exemplo descritas na presente invenção.
[0010] A figura 2 é um diagrama de blocos ilustrando componentes do dispositivo ilustrado na figura 1 em maior detalhe.
[0011] As figuras 3A - 3C são diagramas de temporização que ilustram exemplos de uma unidade de processamento gráfico (GPU) que recebe comandos para renderização de quadros.
[0012] A figura 4 é um diagrama de temporização que ilustra outro exemplo de uma GPU que recebe comandos para renderizar quadros.
[0013] A figura 5 é um gráfico que ilustra o número de comandos que uma GPU deve executar durante um período de tempo.
[0014] A figura 6A é um gráfico que ilustra uma determinação de percentual de nível de ocupação ao longo do período de tempo ilustrado na figura 5 utilizando uma técnica de exemplo.
[0015] A figura 6B é um gráfico que ilustra uma determinação de percentual de nível de ocupação ao longo do período de tempo ilustrado na figura 5 utilizando outra técnica de exemplo.
[0016] A figura 7 é um fluxograma ilustrando um método de exemplo de determinação de frequência de clock de acordo com técnicas descritas na presente invenção.
DESCRIÇÃO DETALHADA
[0017] Uma unidade de processamento, como uma unidade de processamento gráfico (GPU), inclui um clock interno que define a taxa na qual a GPU processa as instruções (por exemplo, define a frequência de operação da GPU). Um clock maior resulta em maior consumo de energia pela GPU, mas permite que a GPU processe mais comandos por segundo. Em outras palavras, um clock mais alto permite que a GPU forneça um desempenho mais alto, mas ao custo de um consumo de energia mais alto. Um menor clock resulta em menos consumo de energia pela GPU, mas reduz o número de comandos que a GPU pode processar por segundo. Em outras palavras, um clock menor faz com que a GPU ofereça um desempenho menor, mas em benefício do menor consumo de energia. Por exemplo, um nível de tensão aplicado à GPU ou a um oscilador dentro da GPU determina o clock e um nível de tensão mais alto resulta em um clock mais alto, porém maior consumo de energia e um nível de tensão mais baixo resultam em um clock menor de menor consumo de energia.
[0018] Em alguns exemplos, um processador hospedeiro (por exemplo, unidade de processamento central (CPU)) pode determinar a frequência na qual a GPU deve operar. Como descrito acima, operar em uma frequência mais alta resulta em conclusão rápida, mas ao custo de consumo de energia extra. Assim, o processador hospedeiro tenta definir a frequência de operação da GPU para manter baixo o consumo de energia sem afetar a conclusão no prazo.
[0019] Para facilidade de descrição, esta presente invenção apresenta o processador hospedeiro que determina a frequência de operação (por exemplo, taxa de clock) da GPU. Contudo, as técnicas descritas nesta descrição não são tão limitadas e as técnicas de exemplo podem ser aplicadas na GPU, como também descrito abaixo.
[0020] Esta apresentação descreve formas de exemplo para ajustar proativamente a taxa de clock da GPU (por exemplo, ajustar a frequência de operação da GPU) com base nos recursos utilizados pela GPU para renderizar um quadro. Para determinar a frequência de operação, o processador do hospedeiro determina o quão ocupado (por exemplo, quantas unidades aritméticas estão operacionais) durante certo período de tempo. Como um exemplo, o processador hospedeiro pode determinar, em intervalos de tempo definidos, o quanto está ocupada estava a GPU. Como outro exemplo, o processador hospedeiro pode determinar o quanto está ocupada a GPU era toda vez que a GPU estivesse ociosa (por exemplo, o intervalo de tempo desde quando a GPU estava inativa na última vez em que a GPU estava inativa novamente). Em alguns casos, embora a quantidade de dados que a GPU processa possa ser relativamente constante, a GPU pode não receber os dados em intervalos regulares. Portanto, determinar se a GPU está ocupada em intervalos definidos ou toda vez que a GPU estiver ociosa pode resultar no fato de o processador hospedeiro determinar níveis de frequência de operação da GPU bastante flutuantes. Nos exemplos em que a GPU determina sua taxa de clock, a GPU pode executar funções semelhantes às descritas acima para o processador hospedeiro e, como o processador hospedeiro, a GPU pode determinar níveis de frequência de operação muito flutuantes.
[0021] Nas técnicas descritas na presente invenção, o processador hospedeiro determina quando a GPU terminou a renderização de um quadro (por exemplo, toda vez que a GPU completa o processamento de um quadro e atinge o final do quadro). O processador do hospedeiro determina, então, o quanto está ocupada a GPU estava desde a conclusão do processamento do quadro até a conclusão do processamento do quadro imediatamente anterior. Ao medir o quanto está ocupada a GPU quadro-to-quadro, o processador hospedeiro pode determinar com mais precisão a frequência de operação da GPU. Em alguns exemplos, a GPU pode determinar a ocupação da GPU desde a conclusão do processamento do quadro até a conclusão do processamento do quadro imediatamente anterior e a frequência de operação da GPU.
[0022] Pode haver várias maneiras em que o processador hospedeiro pode determinar quando a GPU conclui o processamento de um quadro. Como um exemplo, a GPU pode indicar ao processador do hospedeiro toda vez que a GPU concluir uma tarefa da série de tarefas necessárias para processar o quadro. Depois de concluir a última tarefa, o processador hospedeiro pode determinar se a GPU está no final do quadro. Em alguns casos, depois que a GPU conclui o processamento de um quadro, o processador do hospedeiro executa uma função para trocar os buffers para liberar espaço no buffer para o processamento do próximo quadro. Por exemplo, a função para trocar buffers altera um buffer de quadro de leitura para gravação e outro de gravação para leitura, de modo que um esteja sendo gravado enquanto o outro está sendo exibido. A função para trocar buffers pode ser configurada para incluir instruções a partir das quais o processador hospedeiro pode determinar o final do quadro.
[0023] Nos exemplos em que a GPU define sua taxa de clock, a GPU (por exemplo, por meio de um controlador) pode determinar quando a GPU concluiu o processamento de cada quadro. Em resposta, o controlador pode determinar a ocupação da GPU como quadro a quadro e determinar a taxa de clock com base no tempo ocupado quadro a quadro.
[0024] Como as técnicas de exemplo podem ser implementadas por um processador hospedeiro, a GPU ou alguma combinação do processador hospedeiro executando algumas funções e a GPU executando algumas funções, as técnicas descritas na presente invenção podem ser consideradas como sendo executadas por um processador. Um exemplo do processador é o processador hospedeiro (por exemplo, onde o processador hospedeiro determina a taxa de clock da GPU e instrui a GPU a definir a taxa de clock), um exemplo do processador é a GPU (por exemplo, onde a GPU determina sua taxa de clock própria e define a taxa de clock de acordo) e um exemplo do processador é uma combinação do processador hospedeiro e da GPU (por exemplo, onde o processador hospedeiro e a GPU juntos determinam a taxa de clock da GPU e definem a GPU).
[0025] Assim, um processador pode determinar uma primeira instância de tempo quando a GPU completou o processamento de um primeiro quadro e uma segunda instância de tempo quando a GPU completou o processamento de um segundo quadro que precede imediatamente o primeiro quadro. O processador pode determinar um intervalo de tempo baseado na primeira e segunda instâncias de tempo e determinar um nível de ocupação da GPU durante o intervalo de tempo. Com base no nível de ocupação, o processador define a taxa de clock da GPU.
[0026] Por exemplo, o processador pode determinar uma frequência de operação (por exemplo, taxa de clock) da GPU com base no nível de ocupação. No exemplo em que o processador hospedeiro determina a taxa de clock, o processador hospedeiro pode instruir a GPU a definir a taxa de clock com base na taxa de clock determinada. No exemplo em que a GPU determina a taxa de clock, a GPU pode definir a taxa de clock com base na taxa de clock determinada.
[0027] A figura 1 é um diagrama de blocos que ilustra um dispositivo de computação de exemplo 2 que pode ser usado para implementar técnicas desta revelação. O dispositivo de computação 2 pode compreender um computador pessoal, um computador de secretária, um computador portátil, uma estação de trabalho informática, uma consola ou consola de videojogos, um dispositivo de comunicação sem fios (por exemplo, um telemóvel, um telefone celular, um telefone por satélite, e / ou um telefone celular), um telefone fixo, um telefone pela Internet, um dispositivo portátil como um aparelho de videogame portátil ou um assistente digital pessoal (PDA), um reprodutor de música pessoal, um reprodutor de vídeo, um dispositivo de exibição, televisão, um set-top box de televisão, um servidor, um dispositivo de rede intermediário, um computador mainquadro ou qualquer outro tipo de dispositivo que processe e / ou exiba dados gráficos.
[0028] Como ilustrado no exemplo da figura 1, o dispositivo de computação 2 inclui uma interface de entrada do usuário 4, uma CPU 6, um controlador de memória 8, uma memória de sistema 10, uma unidade de processamento gráfico (GPU) 12, uma memória local 14, uma interface de exibição 16, um monitor 18 e um barramento 20 A interface de entrada de usuário 4, a CPU 6, o controlador de memória 8, a GPU 12 e a interface de exibição 16 podem se comunicar entre si usando o barramento 20. O barramento 20 pode ser qualquer uma das várias estruturas de barramento, como um barramento de terceira geração (por exemplo, um barramento Hyper Transport ou um barramento InfiniBand), um barramento de segunda geração (por exemplo, um barramento de porta de gráficos avançados, uma interconexão de componentes periféricos (PCI)). Express bus, ou uma interface Advanced eXentisible (AX!) bus) ou outro tipo de barramento ou interconexão de dispositivos. Deve notar-se que a configuração específica de barras e interfaces de comunicação entre os diferentes componentes mostrados na figura 1 é meramente exemplificativo, e outras configurações de dispositivos de computação e / ou outros sistemas de processamento gráfico com componentes iguais ou diferentes podem ser usados para implementar as técnicas desta revelação.
[0029] A CPU 6 pode compreender um processador de uso geral ou um processador de propósito especial que controla a operação do dispositivo de computação 2. Um usuário pode fornecer entrada para o dispositivo de computação 2 para fazer com que a CPU 6 execute um ou mais aplicativos de software. Os aplicativos de software que são executados na CPU 6 podem incluir, por exemplo, um sistema operacional, um aplicativo de processador de texto, um aplicativo de E-mail, um aplicativo de planilha, um aplicativo de reprodução de mídia, um aplicativo de videogame, um aplicativo de interface gráfica do usuário ou outro programa. O usuário pode fornecer entrada para o dispositivo de computação 2 através de um ou mais dispositivos de entrada (não mostrados) como um teclado, um rato, um microfone, um touchpad ou outro dispositivo de entrada que é acoplado ao dispositivo de computação 2 através da interface de entrada do usuário 4.
[0030] Os aplicativos de software que são executados na CPU 6 podem incluir uma ou mais instruções de renderização de gráficos que instruem a CPU 6 a fazer com que a exibição de dados gráficos seja exibida 18. Em alguns exemplos, as instruções do software podem estar em conformidade com uma interface de programação de aplicativos gráficos (API), como, por exemplo, uma API Open Graphics Library (OpenGL Library), uma API Open Graphics Library Embedded Systems (OpenGL ES) API, uma API Direct3D, uma API X3D, uma API RenderMan, uma API WebGL ou qualquer outra API gráfica padrão pública ou proprietária. As técnicas não devem ser consideradas limitadas à exigência de uma API específica.
[0031] Para processar as instruções de renderização de gráficos, a CPU 6 pode emitir um ou mais comandos de renderização de gráficos para a GPU 12 para fazer com que a GPU 12 execute alguma ou toda a renderização dos dados gráficos. Em alguns exemplos, os dados gráficos a serem renderizados podem incluir uma lista de primitivos gráficos, por exemplo, pontos, linhas, triângulos, quadriláteros, tiras triangulares, etc.
[0032] O controlador de memória 8 facilita a transferência de dados que entram e saem da memória do sistema 10. Por exemplo, o controlador de memória 8 pode receber comandos de leitura e escrita de memória e prestar assistência a esses comandos em relação à memória 10 para fornecer serviços de memória para os componentes no dispositivo de computação 2. O controlador de memória 8 é acoplado de forma comunicativa à memória do sistema 10. Embora o controlador de memória 8 esteja ilustrado no dispositivo de computação de exemplo 2 da figura 1 como sendo um módulo de processamento separado da CPU 6 e da memória de sistema 10, em outros exemplos, algumas ou todas as funcionalidades do controlador de memória 8 podem ser implementadas em uma ou ambas as CPUs 6 e memória do sistema 10.
[0033] A memória de sistema 10 pode armazenar módulos de programa e / ou instruções que são acessíveis para execução pela CPU 6 e / ou dados para uso pelos programas executados na CPU 6. Por exemplo, a memória do sistema 10 pode armazenar aplicativos de usuários e dados gráficos associados aos aplicativos. A memória de sistema 10 pode, adicionalmente, armazenar informações para uso e / ou geradas por outros componentes do dispositivo de computação 2. Por exemplo, a memória do sistema 10 pode atuar como uma memória do dispositivo para GPU 12 e pode armazenar dados a serem operados pela GPU 12, bem como dados resultantes de operações realizadas pela GPU 12, por exemplo, memória do sistema 10 pode armazenar qualquer combinação de buffer de textura, buffers de profundidade, buffers de gráficos, buffers de vértices, buffers de quadro ou similares. Além disso, a memória do sistema 10 pode armazenar fluxos de comandos para processamento pela GPU 12. A memória de sistema 10 pode incluir uma ou mais memórias voláteis ou não voláteis ou dispositivos de armazenamento, tais como, por exemplo, memória de acesso aleatório (RAM), RAM estática (SRAM), RAM dinâmica (DRAM), memória somente de leitura (ROM), ROM apagável programável (EPROM), ROM programável com apagamento eléctrico (EEPROM), memória flash, suporte de dados magnético ou suporte de armazenamento óptico.
[0034] Em alguns aspectos, a memória do sistema 10 pode incluir instruções que fazem com que a CPU 6 e / ou a GPU 12 executem as funções atribuídas à divulgação das latas para a CPU 6 e a GPU 12. Por conseguinte, a memória de sistema 10 pode ser um meio de armazenamento legível por computador, com instruções armazenadas no mesmo, que, quando executadas, fazem com que um ou mais processadores (por exemplo, CPU 6 e GPU 12) executem várias funções.
[0035] Em alguns exemplos, a memória do sistema 10 é um meio de armazenamento não transitório. O termo "não- estacionário" indica que o meio de armazenamento não é incorporado em uma onda portadora ou em um sinal propagado. No entanto, o termo "não transitório" não deve ser interpretado para significar que a memória do sistema 10 é inamovível ou que o seu conteúdo é estático. Como um exemplo, a memória de sistema 10 pode ser removida do dispositivo 2 e movida para outro dispositivo. Como outro exemplo, a memória, substancialmente semelhante à memória do sistema 10, pode ser inserida no dispositivo 2. Em certos exemplos, um meio de armazenamento não transitório pode armazenar dados que podem, com o tempo, mudar (por exemplo, na RAM).
[0036] A GPU 12 pode ser configurada para executar operações gráficas para renderizar uma ou mais primitivas gráficas a serem exibidas 18. Assim, quando um dos aplicativos de software executados na CPU 6 requer processamento gráfico, a CPU 6 pode fornecer dados gráficos e comandos gráficos para a GPU 12 a renderização para exibição 18. Os comandos gráficos podem incluir, por exemplo, comandos de desenho como chamar, comandos de programação de estado de GPU, comandos de transferência de memória, comandos de computação de propósito geral, comandos de execução de kernel, etc. Em alguns exemplos, a CPU 6 pode fornecer os dados de comandos e gráficos para a GPU 12, escrevendo os dados de comandos e gráficos, para a memória 10, que pode ser acessada pela GPU 12. Em alguns exemplos, a GPU 12 pode ser configurada para realizar computação de propósito geral para aplicações que executam na CPU 6.
[0037] A GPU 12 pode, em alguns casos, ser construída com uma estrutura altamente similar que fornece processamento mais eficiente de operações vetoriais do que a CPU 6. Por exemplo, a GPU 12 pode incluir uma série de elementos de processamento que estão configurados para operar em múltiplos vértices ou pixels de uma maneira paralela. A natureza altamente paralela da GPU 12 pode, em alguns casos, permitir que a GPU 12 desenhe imagens gráficas (por exemplo, GUIs e cenas gráficas bidimensionais (2D) e / ou tridimensionais (3D)) na tela 18 mais rapidamente do que desenhar as cenas diretamente para exibir 18 usando CPU 6. Além disso, a natureza altamente paralela da GPU 12 pode permitir que a GPU 12 processe certos tipos de operações de vetor e matriz para aplicações de computação de uso geral mais rapidamente do que a CPU 6.
[0038] A GPU 12 pode, em alguns casos, ser integrada em uma placa-mãe do dispositivo de computação 2. Em outros casos, a GPU 12 pode estar presente em uma placa gráfica instalada em uma porta na placa-mãe do dispositivo de computação 2 ou pode estar incorporada a um dispositivo periférico configurado para interoperar com o dispositivo de computação 2. Em outros casos, a GPU 12 pode estar localizada no mesmo microchip que a CPU 6 formando um sistema em um chip (SoC). A GPU 12 e a CPU 6 podem incluir um ou mais processadores, como um ou mais microprocessadores, circuitos integrados específicos para aplicações (ASICs), matrizes de portas programáveis de campo (FPGAs), processadores de sinais digitais (DSPs) ou outros circuitos lógicos integrados ou discretos equivalentes.
[0039] A GPU 12 pode ser diretamente acoplada à memória local 14. Assim, a GPU 12 pode ler dados e gravar dados na memória local 14, necessariamente usando o barramento 20. Em outras palavras, a GPU 12 pode processar dados localmente usando um armazenamento local, em vez de memória fora do chip. Isso permite que a GPU 12 opere de maneira mais eficiente, eliminando a necessidade da GPU 12 de ler e gravar dados através do barramento 20, que pode experimentar tráfego pesado de barramento. Em alguns casos, no entanto, a GPU 12 pode não incluir um cache separado, mas, em vez disso, utilizar a memória do sistema 10 através do barramento 20. A memória local 14 pode incluir uma ou mais memórias voláteis ou não voláteis ou dispositivos de armazenamento, tais como, por exemplo, memória de acesso aleatório (RAM), RAM estática (SRAM), RAM dinâmica (DRAM), apagável ROM programável (EPROM), ROM programável eletricamente apagável (EEPROM), memória flash, mídia de dados magnética ou mídia de armazenamento ótico.
[0040] A CPU 6 e / ou a GPU 12 podem armazenar dados de imagem renderizados em um buffer de quadro que é alocado dentro da memória do sistema 10. A interface de exibição 16 pode recuperar os dados do buffer de quadros e configurar a exibição 18 para exibir a imagem representada pelos dados da imagem renderizada. Em alguns exemplos, a interface de exibição 16 pode incluir um conversor digital-analógico (DAC) que é configurado para converter os valores digitais recuperados do buffer de quadros em um consumível de sinal analógico pelo visor 18. Em outros exemplos, a interface de exibição 16 pode passar os valores digitais diretamente para exibir 18 para processamento. O ecrã 18 pode incluir um monitor, um televisor, um dispositivo de projeção, um mostrador de cristal líquido (LCD), um painel de plasma, um diodo emissor de luz (LED), uma tela de tubo de raios catódicos (CRT), painel eletrônico, uma superfície - condição emitida por elétrons (SED), uma tela de televisão a laser, um display de nano cristais ou outro tipo de unidade de exibição. O monitor 18 pode ser integrado no dispositivo de computação 2. Por exemplo, o mostrador 18 pode ser um ecran de um telefone móvel ou de um computador tablet. Alternativamente, a tela 18 pode ser um dispositivo independente acoplado ao dispositivo de computação 2 através de um link de comunicação com ou sem fio. Por exemplo, a tela 18 pode ser um monitor de computador ou um monitor de tela plana conectado a um computador pessoal por meio de um cabo ou link sem fio.
[0041] Conforme descrito, a CPU 6 pode descarregar o processamento de gráficos na GPU 12, como tarefas que exigem operações paralelas em massa. Como um exemplo, o processamento de gráficos requer operações paralelas massivas e a CPU 6 pode descarregar essas tarefas de processamento gráfico na GPU 12. No entanto, outras operações, como operações matriciais, também podem se beneficiar dos recursos de processamento paralelo da GPU 12. Nestes exemplos, a CPU 6 pode aproveitar os recursos de processamento paralelo da GPU 12 para fazer com que a GPU 12 realize operações relacionadas a não-gráficos.
[0042] Nas técnicas descritas na presente invenção, uma primeira unidade de processamento (por exemplo, CPU 6) transfere determinadas tarefas para uma segunda unidade de processamento (por exemplo, GPU 12). Para descarregar tarefas, a CPU 6 gera comandos a serem executados pela GPU 12 e dados que são operados dos comandos (por exemplo, dados nos quais os comandos operam) para a memória do sistema 10 e / ou diretamente para a GPU 12. A GPU 12 recebe os comandos e dados, diretamente da CPU 6 e / ou da memória do sistema 10, e executa os comandos. Em alguns exemplos, em vez de armazenar comandos a serem executados pela GPU 12, e os operados de dados para os comandos, na memória 10, a CPU 6 pode armazenar os comandos e operados de dados em uma memória local que é local para o IC que inclui GPU 12 e CPU 6 e compartilhados pela CPU 6 e GPU 12 (por exemplo, memória local 14). Em geral, as técnicas descritas na presente invenção são aplicáveis às várias maneiras em que C 6 pode disponibilizar os comandos para execução na GPU 12, e as técnicas não estão limitadas aos exemplos acima.
[0043] A taxa na qual a GPU 12 executa os comandos é definida pela frequência de um sinal de clock (também conhecido como frequência ou frequência de operação de GPU 12). Por exemplo, a GPU 12 pode executar um comando a cada borda ascendente ou descendente do sinal de clock, ou executar um comando a cada borda ascendente e outro comando a cada borda descendente do sinal de clock. Por conseguinte, com que frequência uma margem de subida ou descida do sinal de clock ocorre dentro de um período de tempo (por exemplo, frequência do sinal de clock) define quantos comandos a GPU 12 executa dentro do período de tempo.
[0044] Em alguns exemplos, como aqueles em que a CPU 6 armazena comandos a serem executados pela GPU 12 na memória (por exemplo, sistema, memória 10 ou uma memória local), a CPU 6 pode enviar informações de endereço de memória identificando um grupo de comandos que a GPU 12 deve executar. O grupo de comandos que a GPU 12 deve executar é chamado de comandos enviados. Nos exemplos em que a CPU 6 envia diretamente os comandos para a GPU 12, os comandos enviados incluem aqueles comandos que a CPU 6 instrui a GPU 12 a executar imediatamente.
[0045] Pode haver várias maneiras em que a CPU 6 pode agrupar comandos. Como por exemplo, um grupo de comandos inclui todos os comandos necessários por G PU 12 para renderizar um quadro. Como em um outro exemplo, um grupo de comandos pode ser chamado de "comandos atômicos" que devem ser executados juntos sem a comutação da GPU 12 para outros comandos. Outras formas de agrupar comandos que são submetidos à GPU 12 podem ser possíveis, e a presente invenção não está limitada às técnicas de exemplo acima.
[0046] Em alguns casos, a GPU 12 pode executar os comandos enviados dentro de um período de tempo definido. Por exemplo, o dispositivo 2 pode ser dispositivo portátil, onde o visor 8 também funciona como a interface do usuário. Como um exemplo, para obter uma interface de usuário livre de interrupções (também chamada de livre de jangadas), a GPU 12 pode concluir a execução dos comandos enviados em aproximadamente 16 milissegundos (ms), assumindo uma taxa de 60 quadros por segundo (outros períodos de tempo) seja possível. Este período de tempo de 16 ms pode ser chamado de janela "vsync", e se a GPU 12 não concluir a execução dos comandos enviados dentro da janela do vsync, pode haver "bolhas" em um pipeline de execução da GPU 12 causando um jank preenchido pela interface de usuário.
[0047] As "bolhas" no pipeline de execução da GPU 12 referem-se a condições em que unidades da GPU 12 que executam os comandos completaram parcialmente a execução dos comandos para produzir alguns dados intermediários, mas unidades da GPU 12 que receberão os dados intermediários ainda estão ocupados executando outros comandos, fazendo com que os dados intermediários continuem sendo construídos. Por exemplo, o pipeline de execução da GPU 12 inclui uma série de unidades, cada uma produzindo dados intermediários que são processados pela próxima unidade da série (ou seja, na pipeline). Em alguns casos, as unidades upstream de um pipeline de execução da GPU 12 estão produzindo dados intermediários mais rapidamente do que as unidades downstream do pipeline de execução da GPU 12 podem consumir, criando uma assim chamada bolha.
[0048] A quantidade de comandos que CPU 6 submete e o momento em que a CPU 6 submete comandos não precisa necessariamente ser constante. Pode haver um influxo ou redução no número de comandos que a GPU 12 deve executar. Por exemplo, o aplicativo em execução na CPU 6 (por exemplo, um aplicativo de terceiros) pode aumentar ou diminuir o número de comandos a serem executados pela GPU 12 ou um sistema operacional em execução na CPU 6 (por exemplo, a própria estrutura) pode aumentar ou diminuir o número de comandos a serem executados pela GPU 12. Como outro exemplo, a CPU 6 pode submeter um primeiro grupo de comandos no tempo 0, um segundo grupo de comandos no tempo 1 e um terceiro grupo de comandos no tempo 2. No entanto, o intervalo de tempo entre a submissão do primeiro grupo de comandos e o segundo grupo de comandos pode ser diferente do intervalo de tempo entre a submissão do segundo grupo de comandos e o terceiro grupo de comandos.
[0049] Porque a quantidade de comandos GPU 12 é para executar dentro de um período de tempo definido (por exemplo, 16 ms) pode mudar, a frequência do sinal de clock da GPU 12 (ou seja, a taxa de clock da GPU 12 ou a frequência de operação da GPU 12) pode ser necessário aumentar ou diminuir para que a GPU 12 seja capaz de executar os comandos dentro do período de tempo definido, sem aumentar desnecessariamente o consumo de energia. A quantidade de comandos que a GPU 12 precisa para executar dentro do período de tempo definido pode mudar porque há mais ou menos comandos ser em um grupo de comandos que precisam ser executados dentro do período de tempo definido, porque há um aumento ou diminuição no número de grupos de comandos que precisam ser executados dentro do período de tempo definido ou uma combinação dos dois.
[0050] Se a frequência do sinal de clock fosse permanentemente mantida em uma frequência relativamente alta, então a GPU 12 seria capaz de executar os comandos enviados em tempo hábil na maioria dos casos. No entanto, executar comandos a uma frequência relativamente alta faz com que o consumo de energia da GPU 12 aumente (por exemplo, é necessária mais energia elétrica para acionar a GPU 12 com um clock maior). Se a frequência do sinal de clock for permanentemente mantida em uma frequência relativamente baixa, então o consumo de energia da GPU 12 pode ser reduzido (por exemplo, menos energia elétrica é necessária para acionar a GPU 12 com um clock menor), mas a GPU 12 pode não ser capaz de executar a tempo comandos enviados na maioria dos casos, levando a um comportamento descartável (jank) e possivelmente a outros efeitos indesejados.
[0051] As técnicas descritas nesta descrição descrevem exemplos de maneiras de aumentar proativamente ou diminuir a taxa de clock (ou seja, a frequência do sinal de clock) da GPU 12 com base no uso da GPU 12 ao longo de um intervalo de tempo específico. Um exemplo do intervalo de tempo usado para determinar a taxa de clock da GPU 12 é o intervalo de tempo entre quando a GPU 12 completou a renderização de um quadro atual e quando a GPU 12 completou a renderização de um quadro anterior que precede imediatamente o quadro atual. A conclusão da renderização de um quadro, conforme usado na presente invenção, refere-se à GPU 12 executando todos os comandos necessários para renderizar o quadro, incluindo, mas não necessariamente sempre incluindo, comandos para armazenar o quadro renderizado na memória do sistema 10. Por exemplo, a conclusão da renderização de um quadro pode ser considerada como a instância quando a GPU 12 determinou o valor do pixel do último pixel do quadro ou quando a GPU 12 escreveu o valor do pixel do último pixel do quadro na memória do sistema 10.
[0052] Um quadro, como utilizado na presente invenção, refere-se a uma imagem completa, mas pode ser uma parte da imagem completa em alguns exemplos, que podem ser apresentados. Por exemplo, pode haver um fundo estático que não seja novamente renderizado a cada vez, mas o quadro renderizado pela GPU 12 pode ser composto (por exemplo, pela interface de exibição 16) com o plano de fundo estático para gerar a imagem completa. Como outro exemplo, a interface de exibição 16 pode combinar vídeo e o quadro renderizado pela GPU 12.
[0053] O quadro inclui uma série de pixels que representam o conteúdo gráfico, com cada pixel tendo um valor de pixel. Por exemplo, depois que a GPU 12 renderiza um quadro, a GPU 12 armazena os valores de pixels resultantes dos pixels do quadro em um buffer de quadro, que pode estar na memória do sistema 10. A interface de exibição 16 recebe os valores de pixel dos pixels do quadro do buffer de quadros e gera valores com base nos valores de pixel para fazer com que o mostrador 18 exiba o conteúdo gráfico do quadro. Em alguns exemplos, a interface de exibição 16 faz com que o mostrador 18 exiba quadros a uma taxa de 60 quadros por segundo (fps) (por exemplo, um quadro é exibido aproximadamente a cada 16,67 ms).
[0054] Na descrição que se segue, as técnicas de exemplo são descritas em relação à CPU 6, que determina um nível de ocupação da GPU 12 e estabelece uma frequência de clock da GPU 12. No entanto, essas técnicas também podem ser implementadas pela GPU 12 ou CPU 6 e GPU 12 juntas.
[0055] Para garantir que a GPU 12 esteja operando em uma frequência de operação alta o suficiente para garantir que o requisito de 60 fps seja atendido, mas não muito alto, o CPU 6 pode determinar um nível de ocupação da GPU 12, que indica o quão ocupado a GPU 12 renderiza um quadro. O nível de ocupação refere-se à quantidade de tempo que a GPU 12 estava executando comandos para renderizar o quadro durante o intervalo de tempo. Considerado de outra forma, o nível de ocupação indica quantos ciclos de GPU (por exemplo, ciclos de clock da GPU 12) foram usados durante o intervalo de tempo para renderizar o quadro. A medição do nível de ocupação pode ser em unidades de tempo e pode ser por vezes representada como uma percentagem (por exemplo, quantidade de tempo ocupado dividido pelo intervalo de tempo multiplicado por 100). Em geral, o nível de ocupação refere- se à quantidade de tempo que a GPU 12 demora em concluir uma carga de trabalho de quadros.
[0056] A GPU 12 pode incluir circuitos que incrementam um contador toda vez que uma unidade dentro da GPU 12 armazena dados e / ou lê dados de um ou mais registradores de uso geral (GPRs), Na conclusão do tempo de intervalo (por exemplo, depois que a GPU 12 completa a renderização do quadro), a CPU 6 pode determinar o número de vezes que as unidades dentro da GPU 12 acessaram os um ou mais GPRs para renderizar o quadro. Por exemplo, a CPU 6 pode determinar a diferença entre o valor do contador no final da conclusão da renderização do quadro imediatamente anterior e o valor do contador no final da conclusão da renderização do quadro atual para determinar o número de vezes que as unidades dentro da GPU 12 acessou o um ou mais GPRs para renderizar o quadro.
[0057] O número de vezes que as unidades com GPU 12 acessaram um ou mais GPRs talvez seja uma boa aproximação do número de ciclos de clock usados para renderizar o quadro. Com base na taxa de clock da GPU 12 durante a renderização do quadro e no número de ciclos de clock usados para renderizar o quadro, a CPU 6 pode determinar a quantidade de tempo que a GPU 12 ficou ocupada durante a renderização do quadro. Por exemplo, o número de ciclos de clock usados para renderizar o quadro multiplicado pelo período de clock de GU 12 indica a quantidade de tempo que a GPU 12 ficou ocupada durante a renderização do quadro (por exemplo, nível de ocupação da GPU 12 para renderizar o quadro, quadro.
[0058] Conforme um outro exemplo, a GPU 12 pode incluir circuitos que incrementam um contador, com o ciclo de clock da GPU 12, desde que qualquer sub-bloco da GPU (por exemplo, unidade dentro da GPU 12) esteja ocupado. O valor no contador é indicativo do número de ciclos de clock usados para renderizar o quadro.
[0059] O exemplo acima é um exemplo de como a CPU 6 determina o nível de ocupação da GPU 12. As técnicas descritas na presente invenção não estão limitadas a este exemplo específico que determina o nível de ocupação da GPU 12. Pode haver várias maneiras diferentes de determinar o nível de ocupação da GPU 12, e a CPU 6 pode empregar uma ou mais das diferentes maneiras de determinar o nível de ocupação da GPU 12.
[0060] A CPU 6 pode dividir a quantidade de tempo que a GPU 12 estava ocupada processando o quadro atual com a quantidade de tempo no intervalo de tempo para determinar um percentual de nível de ocupação da GPU 12. Em alguns exemplos, a CPU 6 pode dividir a quantidade de tempo que a GPU 12 estava ocupada para renderizar o quadro atual com uma quantidade média de tempo para um número N anterior de intervalos de tempo para determinar o percentual do nível de ocupação da GPU 12. Em ambos os exemplos, o percentual de nível de ocupação é baseado no nível de ocupação do quadro atual e não com base no nível de ocupação de qualquer quadro mais oleoso (por exemplo, quão ocupada a GPU 12 estava exibindo apenas o quadro atual).
[0061] A CPU 6 pode então determinar se deve aumentar ou diminuir a taxa de clock da GPU 12. Por exemplo, se o percentual do nível de ocupação for maior do que um primeiro limite, a CPU 6 poderá aumentar a frequência da GPU 12 e se o percentual de ocupação for menor que um segundo limite, a CPU 6 poderá diminuir a frequência da GPU 12. O primeiro limite e o segundo limite podem ser limites diferentes ou o mesmo limite. Em alguns exemplos, pode haver vários limites a partir dos quais a CPU 6 pode determinar o quanto aumentar ou diminuir a taxa de clock da GPU 12.
[0062] Em alguns exemplos, em vez de CPU 6 ou em combinação com CPU 6, GPU 12, pode determinar o intervalo de tempo entre quando a GPU 12 completou a renderização de um quadro atual e quando a GPU 12 completou a renderização de um quadro anterior que precede imediatamente o atual quadro, Por exemplo, um controlador de GPU 12 pode ler os contadores de exemplo descritos acima para determinar o quão ocupada GPU 12 estava durante a renderização de quadro com uma quantidade média de tempo que a GPU 12 estava ocupando para renderizar um número N perverso de intervalos de tempo. O controlador da GPU 12 pode então aumentar ou diminuir a taxa de clock similar ao exemplo acima descrito em relação à CPU 6.
[0063] Determinando o nível de ocupação com base no fim do quadro até o final do quadro (por exemplo, o intervalo de tempo entre quando a GPU 12 completou a renderização de um quadro atual e quando a GPU 12 completou a renderização de um quadro anterior que precede imediatamente o quadro atual), CPU 6 e / ou GPU 12 podem determinar a taxa de clock da GPU 12 de forma relativamente rápida e relativamente precisa. Em algumas técnicas, em vez de determinar o intervalo de tempo, sobre qual CPU 6 e / ou GPU 12 determina o percentual de nível de ocupação ou ocupado, com base no fim de quadro até o final de quadro, a CPU 6 pode determinar o tempo intervalo baseado em instâncias quando a GPU 12 está ociosa.
[0064] Entretanto, determinar o percentual de nível de ocupação ou nível de ocupação com base na GPU 12 está ociosa ou com base em um intervalo de tempo atual pode exigir vários níveis de ocupação ou percentuais de nível de ocupação para determinar um nível de ocupação ou percentual de nível de ocupação precisos. Determinar o nível de ocupação ou o percentual de nível de ocupação como um valor médio requer que a CPU 6 espere que a GPU 12 renderize vários quadros, porque CPU 6 pode determinar a taxa de clock da GPU 12. Aguardando a GPU 12 renderizar resultados de vários quadros em um longo atraso para determinar o percentual do nível de ocupação ou do nível de ocupação e atrasa o ajuste da GPU 12 da frequência, o que pode levar a um comportamento insignificante.
[0065] Por exemplo, a GPU 12 é considerada inativa se a GPU 12 não exibir nenhum dado gráfico por um período limitado. Em alguns exemplos, a CPU 6 monitora o acesso pela GPU 12 a locais de armazenamento para os quais a GPU 12 armazena valores de pixel para determinar que nenhum dado gráfico foi produzido por um período de tempo limite. Em resposta, a CPU 6 lê os contadores, conforme descrito acima, para determinar o nível de ocupação e o percentual do nível de ocupação. Por exemplo, a CPU 6 determina a diferença nos contadores desde a última vez em que a GPU 12 esteve inativa para a instância atual em que a GPU 12 está inativa (por exemplo, o tempo ocioso para inativo).
[0066] No entanto, porque quando a GPU 12 se torna ociosa e o número de quadros processados entre os momentos em que a GPU 12 fica inativa pode ser relativamente aleatório, confiar em instâncias de quando a GPU 12 fica ociosa pode não ser benéfico em todas as circunstâncias. Por exemplo, muitas vezes, um quadro segue imediatamente outro quadro, significando que há uma lacuna relativamente grande entre o tempo ocioso para inativo da GPU 12. Se apenas um quadro for renderizado entre o tempo ocioso para inativo da GPU 12, o tempo ocioso para inativo pode ser relativamente curto. Isso resulta na flutuação dos percentuais de nível de ocupação, mesmo se a carga de trabalho de cada um dos quadros for a mesma. Para equilibrar as flutuações, a CPU 6 pode calcular a média dos percentuais de nível de ocupação em vários intervalos de tempo de inatividade para inatividade, o que atrasa quando a taxa de clock da GPU 12 é definida. Além disso, se houver um longo atraso antes que ocorra uma inatividade (por exemplo, devido a vários quadros sendo renderizados sem tempo ocioso entre eles), a CPU 6 pode ser atrasada na determinação da taxa de clock da GPU 12.
[0067] Além disso, em alguns casos, pode haver tempo ocioso no processamento de um quadro. Por exemplo, a maneira pela qual a CPU 6 pode enviar comandos para a GPU 12 para renderizar um quadro pode incluir cenários em que a CPU 6 envia uma série de comandos para a GPU renderizar o quadro, e então há uma porção durante a qual a CPU 6 submete. sem comandos adicionais, e depois da parte, a CPU 6 submete os demais comandos à GPU para renderizar o quadro. Nesse caso, durante essa parte entre a submissão de comandos, a GPU 12 pode ficar inativa. Pode haver mais tempo ocioso do que apenas uma instância em que a GPU 12 está ociosa durante uma parte da renderização do quadro. Esse tempo ocioso que acontece quando a GPU 12 está no processo de renderização de um quadro pode acionar a CPU 6 para determinar a taxa de clock, que pode ser baseada em informações insuficientes, pois a GPU 12 ainda está renderizando o quadro.
[0068] O atraso na determinação do clock significa que a GPU 12 não está reagindo rapidamente às mudanças na quantidade de comandos que a GPU 12 precisa para executar. Por exemplo, se a taxa de clock da GPU 12 não aumentar em resposta a um aumento na carga de trabalho, pode haver jank na interface do usuário exibida na tela 18 devido a possíveis quedas de quadros. Se a taxa de clock da GPU 12 não diminuir em resposta a uma diminuição na carga de trabalho, a GPU 12 poderá desperdiçar energia. Em alguns casos, pode haver um atraso de 200 a 800 ms ao diminuir a taxa de clock da GPU 12 depois que houver uma redução na carga de trabalho, durante a qual a energia consumida pela GPU 12 é desnecessariamente maior do que deveria.
[0069] Com as técnicas descritas na presente invenção, a CPU 6 pode basear-se em informação relacionada com a representação de um único quadro para determinar a taxa do clock, que permite à CPU 6 determinar o quadrante do clock da GPU 12 sem precisar de múltiplas medições do nível de ocupação ou percentual de nível de ocupação. Além disso, como a CPU 6 usa o fim de quadro para acionar quando determinar o nível de ocupação ou o percentual de nível de ocupação, mesmo se houver quadros consecutivos sem tempo ocioso ou se houver tempo ocioso no meio da renderização. Em um quadro, pode haver pouco ou nenhum efeito sobre o nível de ocupação ou detecção de percentual de nível de ocupação. Em alguns exemplos, a GPU 12 pode implementar técnicas semelhantes para determinar sua própria frequência, em vez de a CPU 6 determinar a frequência da GPU 12.
[0070] Para determinar quando a GPU 12 terminou de renderizar um quadro, a CPU 6 pode receber informação da GPU 12 que a CPU 6 usa para determinar que a GPU 12 terminou de renderizar um quadro (por exemplo, emitiu o valor de pixel do timo pixel do quadro). Como um exemplo, como parte da OpenGL API, na conclusão da renderização de um quadro, a GPU 12 pode solicitar espaço de memória na memória do sistema 10 para renderizar o próximo quadro. Para solicitar o espaço de memória, a GPU 12 pode enviar uma solicitação para a CPU 6 para o espaço de memória, e a CPU 6 pode usar a recepção dessa solicitação de memória para determinar que a GPU 12 concluiu a renderização de um quadro. Por exemplo, a GPU 12 executa um gl.SwapBuffer API para gerar um pedido de espaço de memória. Como exemplo, o gl.SwapBuffer pode alterar um buffer de write para read e outro buffer de read para write, mas outras maneiras de solicitar espaço de memória são possíveis. A CPU 6 usa a recepção da solicitação para determinar que a GPU 12 concluiu a renderização de um quadro.
[0071] Como outro exemplo, o kit de ferramentas de software da GPU 12 pode incluir um driver de modo de usuário (UMD) que um desenvolvedor programa GPU 12 para chamar na conclusão da renderização de um quadro, e a execução do UMD faz com que a GPU 12 produza um fim de marcador-quadro. A CPU 6 usa o marcador de final de quadro para determinar que a GPU 12 concluiu a renderização de um quadro. Como outro exemplo, o gl.SwapBuffer API pode ser atualizada diretamente com o UMD para que a CPU 6 receba o marcador de fim de quadro com base no gl.SwapBuffer API e não precisa de intervenção do desenvolvedor.
[0072] Outras técnicas para a CPU 6 determinar que a GPU 12 completou a renderização de um quadro são possíveis e as técnicas descritas nesta descrição não devem ser consideradas limitadas aos exemplos acima. Além disso, nos exemplos em que a GPU 12 determina o intervalo de tempo de fim de quadro a fim de quadro, um controlador de GPU 12 pode determinar quando a GPU 12 executou o gl.SwapBuffer API ou quando o UMD é executado. Nesses casos, o controlador pode determinar que a GPU 12 atingiu o final do quadro. Nas técnicas descritas na presente invenção, um processador (por exemplo, CPU 6 também referido como um processador hospedeiro, GPU 12, ou uma combinação dos dois) pode determinar uma primeira instância de tempo quando a GPU 12 completou a renderização de um primeiro quadro e determinar uma segunda instância de tempo quando a GPU 12 completou a renderização de um segundo quadro que precede imediatamente o primeiro quadro.
[0073] A primeira instância de tempo é a instância em que a GPU 12 determinou os valores de pixel de um último pixel do quadro atual ou a instância quando a GPU 12 emitiu os valores de pixel do último pixel do quadro atual. A segunda instância de tempo é a instância em que a GPU 12 determinou os valores de pixel de um último pixel do quadro anterior ou a instância quando a GPU 12 emitiu os valores de pixel do último pixel do quadro atual.
[0074] Em alguns casos, a GPU 12 pode ter ficado inativa por pelo menos uma parte durante a renderização do quadro atual. Por exemplo, a partir do momento que a GPU 12 iniciou a renderização do primeiro quadro, a GPU 12 pode não renderizar continuamente o quadro e pode ficar inativa por algum tempo. Depois de estar inativo para a parte, a GPU 12 pode continuar a renderização do primeiro quadro e depois indica à CPU 6 quando a renderização do primeiro quadro está completa ou determina (por exemplo, através de um controlador) quando a renderização do primeiro quadro está completa.
[0075] Em alguns casos, pode não haver tempo ocioso entre o quadro anterior e atual. Por exemplo, a CPU 6 pode instruir a GPU 12 para renderizar o segundo quadro anterior e depois instruir imediatamente a GPU 12 a renderizar o primeiro quadro atual. Neste exemplo, a GPU 12 começa a renderizar o primeiro quadro imediatamente após a conclusão da renderização do segundo quadro, de modo que não haja tempo inativo da GPU 12 entre renderizar o segundo quadro e renderizar o primeiro quadro.
[0076] A CPU 6 pode determinar a primeira instância de tempo e a segunda instância de tempo com base no recebimento de uma solicitação de memória para renderizar o próximo quadro. Da mesma forma, a GPU 12 pode determinar a primeira instância e a segunda instância com base em quando uma requisição de memória para renderizar o próximo quadro foi transmitida. Desta forma, o processador pode determinar a primeira instância e a segunda instância antes que a GPU 12 se torne inativa, e essencialmente imediatamente após completar a renderização do quadro anterior ou atual. Por exemplo, o processador pode determinar que a GPU 12 terminou de renderizar o segundo quadro ou o primeiro quadro a menos de 5 ms, 2 ms ou mesmo possivelmente menos de 1 ms a partir do final da GPU 12 para renderizar o segundo (anterior) quadro ou o primeiro (atual) (por exemplo, em menos tempo que o tempo que a CPU leva para determinar que a GPU 12 está inativa).
[0077] O processador (por exemplo, CPU 6 e / ou GPU 12) pode determinar um intervalo de tempo baseado na primeira instância e na segunda instância (por exemplo, uma diferença entre a primeira instância de tempo e a segunda instância de tempo). O processador pode determinar um nível de ocupação de GPU 12 para renderizar o quadro atual durante o intervalo de tempo (por exemplo, quantidade de tempo para processar a carga de trabalho para renderizar o quadro durante o intervalo de tempo).
[0078] Com base no nível de ocupação determinado, o processador pode determinar uma taxa de clock da GPU 12. Por exemplo, o processador pode determinar um percentual de nível de ocupação com base no nível de ocupação determinado e no intervalo de tempo determinado (por exemplo, dividir a quantidade de tempo para processar a carga de trabalho durante o intervalo de tempo com a quantidade de tempo do intervalo de tempo). O processador pode comparar o percentual do nível de ocupação com um limite e determinar a taxa de clock com base na comparação.
[0079] Como outro exemplo, o processador pode calcular a média do intervalo de tempo e um ou mais intervalos de tempo anteriores para determinar um intervalo de tempo médio. Neste exemplo, cada um dos um ou mais intervalos de tempo anteriores indica intervalos de tempo entre a conclusão da renderização dos respectivos quadros anteriores. Por exemplo, o processador pode calcular a média do intervalo de tempo entre a renderização do quadro atual e do quadro anterior, o intervalo de tempo entre a renderização do quadro anterior e o quadro imediatamente anterior aos quadros anteriores e assim por diante para N números de intervalos de tempo. Essa média pode ser considerada como uma média de execução em janela.
[0080] O processador pode determinar um percentual de nível de ocupação com base no nível de ocupação determinado e no intervalo de tempo médio e comparar o percentual do nível de ocupação com um limite. Semelhante ao acima, o processador pode determinar a taxa de clock com base na comparação.
[0081] O processador pode determinar uma taxa de clock da GPU 12 com base no nível de ocupação determinado. Em alguns exemplos, o processador pode determinar a taxa de clock da GPU 12 com base no nível de ocupação determinado para renderizar o primeiro quadro e nenhum outro quadro. Desta forma, o processador é configurado para determinar a taxa de clock baseada em um único quadro e não após a GPU 12 renderizar vários quadros, o que permite que a GPU 12 aumente ou desacelere sua frequência de operação com pouco atraso para que a GPU 12 opere em seu menor nível de frequência enquanto ainda oportuna a conclusão da execução de comandos.
[0082] O processador pode definir uma taxa de clock de GPU 12 para o clock determinado. Por exemplo, no exemplo em que o processador é CPU 6, o CPU 6 pode então instruir a GPU 12 a definir um clock da GPU 12 para o clock determinado. No exemplo em que o processador é GPU 12, o controlador da GPU 12 pode instruir a GPU 12 a definir uma taxa de clock da GPU 12. A GPU 12 pode então operar no clock determinado. Embora o processador determine a taxa de clock da GPU 12 com base no quadro atual que define a taxa de clock para renderizar quadros subsequentes, usando apenas um quadro para determinar a taxa de clock, o processador pode atualizar imediatamente a taxa de clock no caso da taxa de clock estava incorreto porque o processador pode atualizar a taxa de clock imediatamente após a GPU 12 concluir a renderização do próximo quadro.
[0083] A figura 2 é um diagrama de blocos ilustrando componentes do dispositivo ilustrado na figura 1 em maior detalhe. Como ilustrado na figura 2, a GPU 12 inclui o controlador 30, o oscilador 34, os registros de contador 35, o processador de imagem (shader) 36 e a função pipeline 38. O processador de shader 36 e o pipeline de função fixa 38 podem juntos formar um pipeline de execução usado para executar funções gráficas ou não relacionadas a gráficos. Embora apenas um processador de shader 36 seja ilustrado, em alguns exemplos, a GPU 12 pode incluir um ou mais processadores de shader semelhantes ao processador de shader 36.
[0084] Os comandos que a GPU 12 deve executar são executados pelo processador de shader 36 e pela função pipeline 38, conforme determinado pelo controlador 30 da GPU 12. O controlador 30 pode ser implementado como hardware na GPU 12 ou software ou firmware executando no hardware da GPU 12. O controlador 30 é um exemplo do controlador descrito acima para executar as técnicas de exemplo nos casos em que a GPU 12 está determinando a taxa de clock.
[0085] O controlador 30 pode receber comandos que devem ser executados para renderizar um quadro a partir do buffer de comando 40 da memória de sistema 10 ou diretamente da CPU 6 (por exemplo, receber os comandos enviados que a CPU 6 determinou que devem ser executados agora pela GPU 12). O controlador 30 também pode recuperar os dados do operado para os comandos do buffer de dados 42 da memória do sistema 10 ou diretamente da CPU 6. Por exemplo, o buffer de comando 40 pode armazenar um comando para adicionar A e B. O controlador 30 recupera esse comando do buffer de comando 40 e recupera os valores de A e B do buffer de dados 42. O controlador 30 pode determinar quais comandos devem ser executados pelo processador de shader 36 (por exemplo, instruções de software são executadas no processador de shader 36) e quais comandos devem ser executados por pipeline de função fixa 38 (por exemplo, comandos para unidades de pipeline de função fixa 38).
[0086] Em alguns exemplos, comandos e / ou dados de um ou ambos do buffer de comando 40 e do buffer de dados 42 podem fazer parte da memória local 14 da GPU 12. Por exemplo, a GPU 12 pode incluir um cache de instruções e um cache de dados, que pode fazer parte da memória local 14, que armazena comandos do buffer de comando 40 e dados do buffer de dados 42, respectivamente. Nestes exemplos, o controlador 30 pode recuperar os comandos e / ou dados da memória local 14.
[0087] O processador de shader 36 e o pipeline de função fixa 38 podem transmitir e receber dados um do outro. Por exemplo, alguns dos comandos que o processador de shader 36 executa podem produzir dados intermediários que são operados para os comandos que as unidades do pipeline de função fixa 38 devem executar. Da mesma forma, alguns dos comandos que as unidades de pipeline de função fixa 38 executam podem produzir dados intermediários, que são operados para os comandos que o processador de shader 36 deve executar. Deste modo, os dados recebidos são progressivamente processados através de unidades de pipeline de função fixa 38 e processador de shader 36 de uma forma de pipeline. Assim, o processador de shader 36 e o pipeline de função fixa 38 podem ser referidos como implementando um pipeline de execução. Em alguns exemplos, a GPU 12 pode incluir mais de um processador de shader 36, e o exemplo na figura 2 é fornecido para meramente ajudar na compreensão.
[0088] Em geral, o processador de shader 36 permite que vários tipos de comandos sejam executados, o que significa que o processador de shader 36 é programável e fornece aos usuários flexibilidade funcional porque um usuário pode programar o processador de shader 36 para executar as tarefas desejadas da maneira mais concebível. As unidades de função fixa do pipeline de função fixa 38, no entanto, são conectadas à maneira pela qual as unidades de função fixa executam tarefas. Consequentemente, as unidades de função fixa podem não fornecer muita flexibilidade funcional.
[0089] Como também ilustrado na figura 2, a GPU 12 inclui o oscilador 34. O oscilador 34 emite um sinal de clock que define as instâncias de tempo quando o processador de shader 36 e / ou unidades de pipeline de função fixa 38 executam comandos. Embora o oscilador 34 seja ilustrado como sendo interno à GPU 12, em alguns exemplos, o oscilador 34 pode ser externo à GPU 12. Além disso, o oscilador 34 não necessita necessariamente apenas fornecer o sinal de clock para GPU 12, e pode também fornecer o sinal de clock para outros componentes.
[0090] O oscilador 34 pode gerar uma onda quadrada, uma onda sinusoidal, uma onda triangular ou outros tipos de ondas periódicas. O oscilador 34 pode incluir um amplificador para amplificar a tensão da onda gerada e produzir a onda resultante como o sinal de clock para a GPU 12.
[0091] Em alguns exemplos, num bordo de subida ou descida do sinal de clock emitido pelo oscilador 34, o processador de shader 36 e cada unidade de pipeline de função fixa 38 podem executar um comando. Em alguns casos, um comando pode ser dividido em subcomandos e o processador de shader 36 e cada unidade de pipeline de função fixa 38 pode executar um subcomando em resposta a uma borda ascendente ou descendente do sinal de clock. Por exemplo, o comando de A + B inclui subcomandos die para recuperar o valor de A e o valor de B, e o processador de shader 36 ou o pipeline de função fixa 38 pode executar cada um desses subcomandos em uma borda ascendente ou em queda borda do sinal do clock.
[0092] A taxa na qual o processador de shader 36 e unidades de pipeline de função fixa 38 executam comandos pode afetar o consumo de energia da GPU 12. Por exemplo, se a frequência do sinal de clock emitido pelo oscilador 34 for relativamente alta, o processador de shader 36 e as unidades da conduta de 38 funções fixas podem executar mais comandos dentro de um período de tempo comparando o número de comandos processador de shader 36 e as unidades do pipeline de função fixa 38 de seria executado para uma frequência relativamente baixa do sinal do clock. No entanto, o consumo de energia da GPU 12, pode ser maior nos casos em que o processador de shader 36 e as unidades de pipeline de função fixa 38 executam mais comandos no período de tempo (devido à maior frequência do sinal de clock do oscilador 34) do que comparado a instâncias onde o processador de shader 36 e as unidades de pipeline de função fixa 38 estão executando menos comandos no período de tempo (devido à menor frequência do sinal de clock do oscilador 34).
[0093] Como descrito acima, a CPU 6 pode descarregar tarefas para GPU 12 devido aos recursos massivos de processamento paralelo da GPU 12. Por exemplo, a GPU 12 pode ser projetada com uma única instrução, estrutura de dados múltiplos (SIMD), na estrutura SIMD, o processador de shader 36 inclui uma série de elementos de processamento SIMD, onde cada elemento de processamento SIMD executa os mesmos comandos, mas em dados diferentes.
[0094] Um comando específico em execução em um determinado elemento de processamento SIMD é referido como um encadeamento. Cada elemento de processamento SIMD pode ser considerado como executando um thread diferente porque os dados para um determinado thread podem ser diferentes; no entanto, o encadeamento em execução em um elemento de processamento é o mesmo comando que o comando em execução nos outros elementos de processamento. Desta forma, a estrutura SIMD permite que a GPU 12 execute muitas tarefas em paralelo (por exemplo, ao mesmo tempo). Para tal GPU 12 estruturada por SIMD, cada elemento de processamento SIMD pode executar um encadeamento em uma borda ascendente ou borda descendente do sinal de clock.
[0095] Para evitar confusão, esta presente invenção usa o termo "comando" para se referir geneticamente a um processo que é executado pelo processador de shader 36 ou unidades de pipeline de função fixa 38. Por exemplo, um comando inclui um comando real, subcomandos constituintes (por exemplo, comandos de chamada de memória), um encadeamento ou outras formas em que a GPU 12 executa uma função específica. Como a GPU 12 inclui o processador de shader 36 e o pipeline de função fixa 38, a GPU 12 pode ser considerada como executando os comandos.
[0096] Além disso, nos exemplos acima, o núcleo sombreado 36 ou unidades de tubulação de função fixa 38 executam um comando em resposta a uma borda ascendente ou descendente do sinal de clock emitido pelo oscilador 34. No entanto, em alguns exemplos, o núcleo sombreado 36 ou unidades de tubulação de função fixa 38 podem executar um comando em uma borda ascendente e outro comando subsequente em uma borda descendente do sinal de clock. Pode haver outras maneiras de "acertar" os comandos, e as técnicas descritas na presente invenção não estão limitadas aos exemplos acima.
[0097] Como a GPU 12 executa comandos em cada borda de subida, borda de falha ou ambas, a frequência do sinal de clock (também conhecida como taxa de clock) emitida pelo oscilador 34 define a quantidade de comandos que a GPU 12 pode executar dentro de um certo tempo. Por exemplo, se GPU 12 executa um comando por borda ascendente do sinal de clock, e a frequência do sinal de clock é de 1 MHz, então a GPU 12 pode executar um milhão de comandos em um segundo.
[0098] Como ilustrado na figura 2, a CPU 6 executa a aplicação 26, conforme ilustrado pelas caixas tracejadas. Durante a execução, o aplicativo 26 gera comandos que devem ser executados GPU 12, incluindo comandos que instruem a GPU 12 a recuperar e executar programas shader (por exemplo, vertex shaders, fragment shader, shaders de computador para aplicativos não gráficos e similares). Além disso, a aplicação 26 gera os dados nos quais os comandos operam (isto é, os comandos para operar). A CPU 6 armazena os comandos gerados no buffer de comando 40 e armazena os dados do operador no buffer de dados 42.
[0099] Depois que a CPU 6 marca os comandos gerados no buffer de comando 40, a CPU 6 disponibiliza os comandos para execução pela GPU 12. Por exemplo, a CPU 6 comunica à GPU 12 os endereços de memória de um conjunto de comandos armazenados e seus dados de operados e informações indicando quando a GPU 12 deve executar o conjunto de comandos. Dessa forma, a CPU 6 envia comandos para a GPU 12 para execução para renderizar um quadro.
[0100] Como ilustrado na figura 2, a CPU 6 também pode executar o driver de gráficos 28. Em alguns exemplos, o driver de gráficos 28 pode ser um software ou firmware sendo executado em unidades de hardware ou hardware da CPU 6. O driver gráfico 28 pode ser configurado para permitir que a CPU 6 e a GPU 12 se comuniquem umas com as outras. Por exemplo, quando a CPU 6 descarrega tarefas gráficas ou de processamento não gráficas na GPU 12, a CPU 6 descarrega essas tarefas de processamento para a GPU 12 por meio do driver de gráficos 28. Por exemplo, quando a CPU 6 produz informação indicando a quantidade de comandos que a GPU 12 deve executar, o driver gráfico 28 pode ser a unidade da CPU 6 que envia a informação para a GPU 12.
[0101] Como exemplos adicionais, o aplicativo 26 produz dados gráficos e comandos gráficos e a CPU 6 pode descarregar o processamento desses dados gráficos para a GPU 12. Neste exemplo, a CPU 6 pode armazenar os dados gráficos no buffer de dados 42 e os comandos gráficos no buffer de comando 40, e o driver gráfico 28 pode instruir a GPU 12 quando recuperar os dados gráficos e comandos gráficos do buffer de dados 42 e do buffer de comando 40, respectivamente, de onde recuperar os comandos gráficos e dados gráficos do buffer de dados 42 e do buffer de comando 40, respectivamente, e quando processar os dados gráficos, executando um ou mais comandos do conjunto de comandos.
[0102] Além disso, a aplicação 26 pode exigir que a GPU 12 execute um ou mais programas de sombreamento. Por exemplo, a aplicação 26 pode requerer o processador de shader 36 para executar um vertex shader e um fragment shader para gerar valores de pixel para os quadros que devem ser exibidos (por exemplo, no mostrador 18 da Figura 1). O driver gráfico 28 pode instruir a GPU 12 quando executar os programas de sombreamento e instruir a GPU 12 de onde recuperar os dados gráficos do buffer de dados 42 e onde recuperar os comandos do buffer de comando 40 ou de outros locais na memória do sistema 10. Desta forma, o driver de gráficos 2,8 pode formar um link entre a CPU 6 e a GPU 12.
[0103] O driver gráfico 28 pode ser configurado de acordo com uma interface de processamento de aplicativos (API); embora o driver de gráficos 28 não precise estar limitado a ser configurado de acordo com uma API específica. Num exemplo em que o dispositivo 2 é um dispositivo móvel, o controlador de gráficos 28 pode ser configurado de acordo com a OpenGL ES API. O OpenGL ES API é projetado especificamente para dispositivos móveis. Num exemplo em que o dispositivo 2 é um dispositivo não móvel, o controlador de gráficos 28 pode ser configurado de acordo com a OpenGL API.
[0104] A quantidade de comandos nos comandos enviados pode ser baseada nos comandos necessários para renderizar um quadro do aplicativo de interface do usuário ou de jogos. Para o exemplo da interface do usuário, a GPU 12 pode precisar executar os comandos necessários para renderizar um quadro da interface do usuário dentro da janela do vsync (por exemplo, tempo de quando um novo quadro deve estar pronto para exibição, como a cada 16 ms) fornecer uma experiência de usuário livre de jank. Se houver uma quantidade relativamente grande de conteúdo que precisa ser exibida, a quantidade de comandos poderá ser maior do que se houver uma quantidade relativamente pequena de conteúdo que precise ser exibida.
[0105] Para assegurar que a GPU 12 seja capaz de executar os comandos enviados dentro do período de tempo definido, o controlador 30 pode ajustar a frequência (isto é, a taxa de clock) do sinal de clock que o oscilador 34 produz. No entanto, para ajustar a taxa de clock do sinal de clock de tal modo que a velocidade do clock é alta o suficiente para permitir que a GPU 12 execute os comandos enviados dentro do período de tempo definido, o controlador 30 pode receber informação indicando aumentar, diminuir ou manter o clock taxa de oscilador 34 o mesmo. Em alguns exemplos, o controlador 30 pode receber informação indicando uma taxa de clock específica para o sinal de clock que o oscilador 34 produz.
[0106] Nas técnicas descritas na presente invenção, em que o CPU 6 determina o ritmo de clock da GPU 12, o módulo de gestão de frequência 32 pode ser configurado para determinar o ritmo do clock do sinal que o oscilador 34 produz. Em alguns exemplos em que a GPU 12 determina a taxa de clock, o controlador 30 pode ser configurado para executar as técnicas de exemplo descritas em relação ao módulo de gerenciamento de frequência 32, mas na GPU 12.
[0107] O módulo de gestão de frequência 32, também referido como módulo de clock dinâmico e escala de tensão (DCVS), é ilustrado como sendo um software executado na CPU 6. Contudo, o módulo de gestão de frequência 32 pode ser hardware na CPU 6 ou uma combinação de hardware e software ou firmware.
[0108] O módulo de gestão de frequência 32 pode ser configurado para determinar uma primeira instância de tempo quando a GPU 12 completou a renderização de um primeiro quadro (atual) e uma segunda instância de tempo quando a GPU 12 completou a renderização de um segundo quadro (anterior) que precede imediatamente o quadro atual. Nesta descrição, o quadro anterior que precede imediatamente o quadro atual refere-se ao quadro que é anterior ao quadro atual sem que nenhum outro quadro esteja entre o quadro anterior e o quadro atual. Em alguns casos, pode haver algum tempo ocioso entre o final da GPU 12 e a renderização do quadro anterior para quando a GPU 12 começou a renderizar o quadro atual. No entanto, em alguns exemplos, pode não haver tempo ocioso entre a conclusão da GPU 12 e a renderização do quadro anterior para quando a GPU 12 começou a renderizar o quadro atual.
[0109] Por exemplo, o driver de gráficos 28 pode enviar, de uma só vez, comandos para renderizar dois quadros. Neste exemplo, o controlador 30 recebe comandos para renderizar o primeiro dos dois quadros e instrui o processador de shader 36 e o pipeline de função fixa 38 para executar os comandos. À medida que os comandos avançam pelo pipeline gráfico, assim que o último comando para renderizar o primeiro quadro prossegue após a primeira unidade no pipeline de gráficos da GPU 12, o controlador 30 recupera o primeiro comando para iniciar a execução do segundo quadro (por exemplo, instrui a primeira unidade do pipeline de gráficos da GPU 12 a ser a execução dos comandos para renderização do segundo quadro). Neste exemplo, não há pausa no processamento pela GPU 12 entre os quadros (por exemplo, nenhum tempo ocioso entre a renderização de dois quadros). Em alguns casos, o driver de gráficos 28 pode enviar, de uma só vez, comandos para mais de dois quadros.
[0110] Em alguns casos, o driver gráfico 28 pode não necessariamente enviar todos os comandos necessários para renderizar um quadro à GPU 12 de uma só vez ou pode enviar todos os comandos, mas não instruir a GPU 12 a executar todos os comandos imediatamente um após o outro. Por exemplo, o driver de gráficos 28 pode enviar um primeiro conjunto de comandos para renderizar o quadro e, em seguida, pausar no envio de mais comandos durante os quais a GPU 12 fica ociosa e, em seguida, enviar os demais comandos para renderizar o quadro. Como outro exemplo, o driver gráfico 28 pode enviar todos os comandos para a GPU 12, instruir a GPU 12 a executar um primeiro conjunto de comandos e instruir a GPU 12 a pausar a execução dos comandos durante os quais a GPU 12 fica inativa e instruir a GPU 12 para executar as instruções restantes. Pode haver mais de uma duração durante a qual a GPU 12 fica inativa durante a renderização de uma estrutura, e os exemplos acima onde a GPU 12, por estar ociosa por apenas uma duração durante a renderização da estrutura, é fornecida apenas para fins de ilustração.
[0111] Conforme descrito acima, as instâncias em que a GPU 12 completa a renderização do quadro atual ou do quadro anterior são as instâncias quando a GPU 12 determinou os valores de pixel do último pixel do quadro atual ou anterior, respectivamente, ou as instâncias quando a GPU 12 emitiu o pixel valores do último pixel do quadro atual ou quadro anterior, respectivamente. Como um exemplo, a instância quando a GPU 12 completa a renderização de um quadro (por exemplo, quadro atual ou anterior) é a instância de uma última execução de um pixel shader no core de sombreamento 36 ou a instância que o shader de pixel está executando no núcleo do shader. gerou o último valor de pixel do quadro.
[0112] Uma maneira pela qual o módulo de gerenciamento de frequência 32 determinou que a GPU 12 acabou de renderizar um quadro (por exemplo, dentro de 5 ms, 2 ms ou mesmo 1 ms de renderização do quadro) é baseada na recepção de uma solicitação de memória na memória do sistema 10. Embora não ilustrado, a GPU 12 produz os valores de pixel (por exemplo, dados gráficos) para um buffer de quadros dentro da memória do sistema 10. Depois de renderizar um quadro, o controlador 30 executa um g1. Swap Buffer API para solicitar. Localizações de memória da CPU 6 para onde armazenar valores de pixel para o próximo quadro. Pode haver um nível muito alto de certeza de que o controlador 30 executará o g1.SwapBuffer API como esta é a maneira em que GPU 12 é alocada memória para renderizar o próximo quadro.
[0113] Neste exemplo, o controlador 30 envia o pedido de memória para o driver de gráficos 28. O driver gráfico 28 encaminha a solicitação ao sistema operacional 24 e ao módulo de gerenciamento de frequência 32. O módulo de gestão de frequência 32, por sua vez, determina a instância de tempo que a GPU 12 completou, renderizando o quadro como o módulo de gestão de frequência de instância de tempo 32 recebeu o pedido. O sistema operacional 24 aloca memória para GPU 12 para saída de valores de pixel para o próximo quadro.
[0114] Como outro exemplo, o controlador 30 pode executar um UMD (driver de modo de usuário) que faz com que o controlador 30 emita um marcador de fim de quadro para o driver gráfico 28, que encaminha o criador de fim de quadro ao módulo de gerenciamento de frequência 32. Como outro exemplo, o gl.SwapBuffer API pode ser atualizada com o UMD, portanto, nenhuma execução adicional é necessária além da execução normal do g1.SwapBuffer API .
[0115] Nos exemplos em que o controlador 30 determina a taxa de clock da GPU 12, o controlador 30 pode determinar quando o UMD ou gl.SwapBuffer API foram executadas. Com base na execução, o controlador 30 pode determinar que a GPU 12 completou a renderização de um quadro e, com base na temporização da execução, o controlador 30 pode determinar a quantidade de tempo que decorreu entre a renderização do final do quadro ao final do quadro.
[0116] Módulo de gestão de frequência 32 pode determinar um intervalo de tempo com base na primeira instância de tempo e a segunda instância de tempo (por exemplo, primeira instância de tempos menos segunda instância de tempo). Além disso, o módulo de gestão de frequência 32 pode determinar um nível de ocupação de GPU 12 para renderizar o quadro atual durante o intervalo de tempo. O controlador 30 pode ser configurado para executar funções semelhantes em exemplos em que o controlador 30 determina o seu ritmo de clock.
[0117] Cada controlador de tempo 30, processador de shader 36, ou pipeline de função fixa 38 lê dados ou armazena dados num registo de uso geral (GPR) dentro da memória local 14, o controlador 30 pode atualizar (por exemplo, incrementar) um contador no contador 35, O módulo de gestão de frequência 32 e/ ou controlador 30 pode ter lido o registro de contador 35 depois da renderização do quadro anterior e pode ler o registro de contador 35 depois da renderização do quadro atual. O módulo de gestão de frequência 32 e / ou controlador 30 pode determinar uma diferença entre os dois valores lidos dos registros de contador 35 e o valor resultante pode ser uma aproximação do número de ciclos de clock do oscilador 34 que levou GPU 12 para renderizar o quadro atual. O módulo de gestão de frequência 32 e / ou controlador 30 pode multiplicar o número determinado de ciclos de clock com o período de tempo do clock do sinal de clock que o oscilador 34 emitia durante a visualização do quadro atual para determinar uma quantidade de tempo de GPU 12 ocupado (por exemplo, nível de ocupação de GPU 12).
[0118] Como outro exemplo, desde que qualquer sub- bloco de GPU da GPU 12 esteja ocupado, o controlador 30 pode atualizar (por exemplo, incrementar) um contador no registro de contador 35. Tal como acima, o módulo de gestão de frequências 32 e / ou o controlador 30 podem ter lido o registro de contador 35 depois da renderização do quadro anterior e podem ler o registro de contador 35 depois da renderização do quadro atual. O módulo de gestão de frequência 32 e / ou controlador 30 pode determinar uma diferença entre os dois valores lidos dos registros de contador 35 e o valor resultante pode ser uma aproximação do número de ciclos de clock do oscilador 34 que levou GPU 12 para renderizar o quadro atual. Também, como acima, o módulo 32 de gestão de frequência e / ou o controlador 30 podem multiplicar o número determinado de ciclos de clock com o período de tempo da frequência do sinal de clock que o oscilador 34 emitia durante a reprodução do quadro atual para determinar se uma GPU 12 estava ocupada (por exemplo, nível de ocupação de GPU 12). Pode haver várias outras maneiras de determinar o nível de ocupação da GPU, e o acima fornece duas técnicas de exemplo.
[0119] O módulo 32 de gestão de frequência e / ou o controlador 30 podem determinar uma frequência de clock do sinal de clock que o oscilador 34 produz com base no nível de ocupação determinado. Nos exemplos em que a CPU 6 ajusta a taxa de clock, o módulo de gestão de frequência 32 pode então fazer com que o driver de gráficos 28 instrua o controlador 30 da GPU 12 a definir uma frequência do sinal de clock que o oscilador 34 envia para a frequência determinada. Nos exemplos em que a GPU 12 ajusta a taxa de clock, o controlador 30 pode ajustar a taxa de clock do sinal de clock que o oscilador 34 produz. Nesta forma, o módulo 32 de gestão de frequência e / ou o controlador 30 podem determinar a frequência do sinal de clock que o oscilador 34 produz com base no nível de ocupação determinado para renderizar o quadro atual e nenhum outro quadro.
[0120] Em um exemplo, o módulo de gerenciamento de frequência 32 e / ou controlador 30 podem determinar um percentual de nível de ocupação com base no nível de ocupação determinado e intervalo de tempo determinado (por exemplo, dividir nível de ocupação com intervalo de tempo multiplicar por 100). O módulo de gestão de frequência 32 e / ou controlador 30 pode comparar o percentual de nível de ocupação com um limite e determinar a taxa de clock do sinal de clock que o oscilador 34 produz com base na comparação.
[0121] Em um exemplo, o módulo de gerenciamento de frequência 32 e / ou o controlador 30 podem rastrear os intervalos de tempo para renderização do quadro atual e intervalos de tempo para renderizar um ou mais quadros anteriores (por exemplo, para um total de 5 quadros). Módulo de gestão de frequência 32 e / ou controlador 30 pode determinar uma média dos intervalos de tempo (isto é, tempo médio de quadro (AFT)). Neste exemplo, o tempo de quadro inicial pode ser definido como um intervalo de vsync (padrão de 16.67 ms, dependendo da taxa de atualização da exibição 18). Os quadros por segundo (FPS) podem ser iguais a 1 / AFT. O FPS de aplicativos gráficos ligados a vsync geralmente é um valor constante e o AFT é relativamente estável.
[0122] Neste exemplo, o módulo de gerenciamento de frequência 32 e / ou o controlador 30 pode determinar o percentual do nível de ocupação dividindo o nível de ocupação para renderizar o quadro atual pelo tempo médio de quadros. Similar ao acima, o módulo 32 de gestão de frequência e / ou o controlador 30 podem comparar o percentual do nível de ocupação com um limite e determinar a frequência do sinal de clock que o oscilador 34 produz com base na comparação. Igualmente, semelhante ao acima, o módulo de gestão de frequência 32 e / ou o controlador 30 pode utilizar o nível de ocupação para renderizar apenas o quadro atual para determinar a taxa de clock, mas pode utilizar os intervalos de tempo de múltiplos quadros anteriores, neste exemplo.
[0123] Como descrito, o módulo de gestão de frequência 32 e / ou o controlador 30 podem seguir os limites do quadro para a determinação da frequência de clock. Por exemplo, o módulo de gestão de frequência 32 e / ou o controlador 30 determina o nível de ocupação da GPU 12 (por exemplo, carga do quadro da GPU 12) e o intervalo de tempo de fim de quadro a fim de quadro (por exemplo, tempo de quadro ou intervalo de tempo entre conclusão da renderização do quadro anterior e conclusão da renderização do quadro atual). O módulo de gestão de frequência 32 e / ou controlador 30 pode utilizar o pedido de memória ou marcadores de fim de quadro como data e hora para determinar o percentual de níveis de ocupação e a duração durante a qual o módulo de gestão de frequência 32 e / ou o controlador 30 determina o nível de ocupação de GPU 12 para renderizar um quadro.
[0124] Deste modo, o módulo de gestão de frequências 32 e / ou o controlador 30 pode reduzir a latência para quando a determinação da taxa de clock é feita para um tempo de quadro, em comparação com outras técnicas que podem requerer cinco ou mais quadros para determinar com precisão a taxa do clock. A baixa latência e a determinação precisa do clock resultam em uma experiência de UI mais suave com menos jank e podem ser de uso particular nos casos em que o gerenciamento preciso da frequência é necessário, como em casos de uso simultâneo. Além disso, com as técnicas, o clock não precisa mudar gradualmente, mas pode pular se necessário. Por exemplo, se a taxa de clock estiver em 200 MHz, mas o percentual de nível de ocupação da GPU 12 for 300%, o módulo de gerenciamento de frequência 32 pode instruir o controlador 30 a fazer com que o oscilador 34 ou o controlador 30 façam com que o oscilador MHz, ignorando as opções de clock de 300 MHz, 400 MHz e 500 MHz.
[0125] Além disso, como as técnicas de exemplo dependem da conclusão da renderização de um quadro para determinar o clock, mesmo se houver uma ou mais partes durante a renderização do quadro que a GPU 12 está ociosa, o módulo de gerenciamento de frequência 32 e / ou o controlador 30 pode não determinar a renderização da metade do quadro do clock, e pode esperar até que o quadro seja renderizado antes de determinar o clock. Além disso, como as técnicas não dependem de tempos inativos da GPU 12 para determinar a frequência, as técnicas descritas na presente invenção podem, com precisão e baixa latência, determinar a frequência mesmo em instâncias onde não há tempos ociosos entre a renderização de quadros, em comparação com outras técnicas que dependem dos tempos ociosos para determinar quando determinar a taxa de clock.
[0126] As figuras 3A - 3C são diagramas de temporização que ilustram exemplos de comandos de recepção da GPU 12 para renderização de quadros. As figuras 3A - 3C ilustram diferentes conjuntos de comandos que a GPU 12 recebe para renderizar quadros. Nos exemplos ilustrados nas figuras 3A - 3C, o percentual real do nível de ocupação da GPU 12, cada vez que o percentual do nível de ocupação é determinado, é a mesma (por exemplo, percentual de nível de ocupação de 50%); no entanto, o percentual determinado do nível de ocupação pode mudar. Nas figuras 3A - 3C, o percentual de nível de ocupação da GPU 12 é o nível de ocupação da GPU 12 dividido pelo intervalo de tempo entre dois ociosos da GPU 12.
[0127] Os números no eixo x das figuras 3A - 3C ilustram instâncias quando a CPU 6 determina o percentual do nível de ocupação. Como ilustrado, passa algum tempo após a GPU 12 concluir a renderização de um quadro antes de ser feita uma determinação de que a GPU 12 está ociosa. Por conseguinte, o tempo que a CPU 6 determina o percentual do nível de ocupação é após a renderização de quadro e não na ou imediatamente após a renderização do quadro. Nas figuras 3A - 3C em algum momento decorre depois que a GPU 12 produz os valores de pixel para o último pixel antes que seja determinado o percentual do nível de ocupação. Conforme descrito acima, a determinação do percentual do nível de ocupação com base nos momentos em que a GPU 12 está ociosa pode exigir um longo atraso antes que uma determinação precisa do percentual do nível de ocupação possa ser feita.
[0128] Por exemplo, a figura 3A ilustra um caso ideal em que a GPU 12 renderiza um quadro e, em seguida, há um tempo definido em que a GPU 12 fica inativa, depois um tempo definido no qual a GPU 12 renderiza o próximo quadro, seguida por um tempo definido em que a GPU 12 está ociosa e assim por diante. Neste exemplo, o percentual real do nível de ocupação e o percentual do nível de ocupação da medição rastreiam um ao outro (por exemplo, ambas são 50%). No entanto, o tráfego ideal da GPU é raro.
[0129] A figura 3B ilustra o caso em que o espaçamento entre quando a GPU 12 é para renderizar quadros não é constante, ao contrário da figura 3A onde era constante. Por exemplo, para os dois últimos quadros, pode não haver tempo ocioso para a GPU 12 entre os quadros de renderização. Neste exemplo, na amostra 1 (por exemplo, logo após o primeiro quadro), a CPU 6 pode determinar que o percentual de nível de ocupação seja 50%, que é o mesmo que o percentual do nível de ocupação real. Na amostra 2 (por exemplo, logo após o segundo quadro), a CPU 6 pode determinar o percentual do nível de ocupação como 60% porque o intervalo de tempo foi menor, mas a quantidade de comandos executados é a mesma (por exemplo, carga de quadros é a mesma) para cada quadro. Nesse caso, como não há tempo inativo entre o quadro de renderização 3 e o quadro 4, nenhuma amostra é obtida após renderizar o quadro 3. Na amostra 3 (por exemplo, logo após o quarto quadro), a CPU 6 pode determinar que o percentual do nível de ocupação seja 40%, porque a quantidade de intervalo de tempo pode ser muito maior. A média do percentual determinado de três níveis de ocupação seria 50% (por exemplo, (50% + 60% + 40%) dividido por 3), mas quatro quadros são processados antes de atingir 50%.
[0130] A figura 3C ilustra o caso em que há tempo ocioso durante a renderização de um quadro, durante o qual a CPU 6 pode determinar o percentual do nível de ocupação. Neste exemplo, na amostra 1, a CPU 6 pode determinar o percentual do nível de ocupação como 50%, na amostra 2, a CPU 6 pode determinar o percentual do nível de ocupação como 60%, na amostra 3, a CPU 6 pode determinar o percentual do nível de ocupação em 30%, na amostra 4, a CPU 6 pode determinar o percentual do nível de ocupação em 30% e na amostra 5 a CPU 6 pode determinar o percentual do nível de ocupação em 80%. A média das amostras é 50%, mas cinco amostras são processadas antes atingindo 50%.
[0131] Portanto, nas figuras 3A - 3C, mesmo com nível de ocupação constante, o percentual de nível de ocupação que a CPU 6 determina pode flutuar se a CPU 6 determinar o percentual do nível de ocupação quando a GPU 12 ficar inativa. Isso pode ocorrer porque a duração inativa do quadro não é distribuída uniformemente e / ou porque pode haver tempo ocioso durante uma parte da renderização do quadro. Em alguns exemplos, a CPU 6 pode usar uma grande janela deslizante de amostras (por exemplo, 3 ou 5 amostras, conforme ilustrado nas figuras 3B e 3C) para filtrar as flutuações. No entanto, ao esperar por uma grande janela deslizante, existe um grande atraso na configuração da taxa de clock do sinal de clock do oscilador 34 da GPU 12.
[0132] Nas técnicas descritas na presente invenção, porque a CPU 6 determina a taxa de clock na conclusão da renderização de um quadro, em vez de durante os tempos inativos. Consequentemente, as flutuações podem não estar presentes, e a CPU 6 pode ser capaz de determinar a taxa de clock após renderizar um quadro em vez de renderizar múltiplos quadros. Mais uma vez, embora o exemplo ilustrado nas figuras 3A - 3C é descrito em relação à CPU 6, as técnicas de exemplo também podem ser executadas pela GPU 12.
[0133] A figura 4 é um diagrama de temporização que ilustra outro exemplo de comandos de recepção da GPU 12 para renderização de quadros. A figura 4 é utilizada para ilustrar porque as técnicas descritas nesta presente invenção reduzem a latência da determinação da taxa de clock do sinal de clock que o oscilador 34 produz. O exemplo é ilustrado em relação à CPU 6, mas também pode ser executado pela GPU 12. Para ilustrar a redução na latência, a figura 4 é descrito em relação à CPU 6 que determina o percentual do nível de ocupação com base na representação apenas do quadro atual e descrita em relação à CPU 6 que determina o percentual do nível de ocupação calculando a média dos percentuais do nível de ocupação. Mesmo se for assumido que o tempo que a GPU 12 fica inativa é o mesmo que o final do quadro, confiar em vários quadros a serem renderizados e, em seguida, a média atrasa a quantidade de tempo antes que a taxa de clock da GPU 12 possa ser configurada. Deve ser entendido que o tempo ocioso estando certo no final do quadro não é como o processo realmente funciona, mas, por exemplo, essa suposição é feita para facilitar a compreensão.
[0134] Na figura 4, existem seis quadros. O nível de ocupação (por exemplo, carga de quadro) para os primeiros cinco quadros é de 10 ms e o nível de ocupação para o sexto quadro é de 15 ms. O intervalo do quadro (por exemplo, fim- de-quadro a fim-de-quadro que é assumido, só para facilidade de entendimento, ser igual tempo ocioso a tempo inativo) para o primeiro quadro é 16 ms, o segundo quadro é 12 ms, o terceiro quadro é 20 ms, o quarto quadro é 20 ms, o quinto quadro é 12 ms e o sexto quadro é 16 ms.
[0135] Para este exemplo, onde a CPU 6 usa apenas o percentual de tempo de ocupação do quadro atual, a CPU 6 pode determinar o intervalo de tempo médio para o primeiro quadro a 16 ms ((16 + 16) /2) (supondo que o tempo de quadro inicial seja 16 ms) e determinar o percentual de tempo de ocupação para o primeiro quadro a ser de 63% (10/16). Para o segundo quadro, a CPU 6 pode determinar o intervalo de tempo médio como 15 ms ((16 + 16 + 12) /3)) e determinar o percentual de tempo de ocupação como 67% (10/15). Para o terceiro quadro, o CPU 6 pode determinar o intervalo de tempo médio como 16 ms ((16 + 16 + 12 + 20) /4)) e determinar o percentual do tempo de ocupação como 63% (10/16). Para o quarto quadro, a CPU 6 pode determinar o intervalo de tempo médio como 17 ms ((16 + 16 + 12 + 20 + 20) /5)) e determinar o percentual do tempo de ocupação como 59% (10/17). Para o quinto quadro, a CPU 6 pode determinar o intervalo de tempo médio como 16 ms ((16 + 16 + 12 + 20 + 20 + 12) /6)) e determinar o percentual do tempo de ocupação como 63% (10/16). Para o sexto quadro, a CPU 6 pode determinar o intervalo de tempo médio como 16 ms ((16 + 16 + 12 + 20 + 20 + 12 + 16) /7)) e determinar o percentual do tempo de ocupação como 94% (15/16).
[0136] Como visto neste exemplo, embora a CPU 6 possa determinar a média dos intervalos de tempo, a CPU 6 pode usar o leque ocupado apenas do quadro atual para determinar o percentual de tempo de ocupação. Por exemplo, a CPU 6 pode usar a utilização de quadros mais atual em vez de uma média móvel. Em alguns exemplos, um driver de modo de usuário (UMD) pode auxiliar o driver de dispositivo do kernel (por exemplo, driver de gráficos 28) com informações de limite de quadro (por exemplo, fim de quadro) que permite à CPU 6 determinar a carga de trabalho de GPU 12 no limite do quadro.
[0137] Neste exemplo, suponha que cinco quadros anteriores tivessem um percentual de ocupação de amostra de 63%. Além disso, suponha que os cinco quadros anteriores sejam usados para determinar o percentual de ocupação médio. Para o caso em que a CPU 6 aguarda os tempos inativos da GPU 12, para a primeira estrutura, a CPU 6 pode determinar o percentual do nível de ocupação como 63% (10/16) e determinar o percentual médio do nível de ocupação como 63% (por exemplo, 63 + 63 + 63 + 63 + 63) /5 = 63). Para o segundo quadro, a CPU 6 pode determinar o percentual do nível de ocupação como 83% (10/12) e determinar o percentual médio do nível de ocupação como 67% (por exemplo, (63 + 63 + 63 + 63 + 83) / 5 = 67). Para o terceiro quadro, a CPU 6 pode determinar o percentual do nível de ocupação como 50% (10/20) e determinar o percentual médio do nível de ocupação como 65% (por exemplo, (63 + 63 + 63 + 83 + 50) / 5 = 64,4). Para o quarto quadro, a CPU 6 pode determinar o percentual do nível de ocupação como 50% (10/20) e determinar o percentual médio do nível de ocupação como 62% (por exemplo, (63 + 63 + 83 + 50 + 50) / 5 = <; :> 61,8). Para o quinto quadro, a CPU 6 pode determinar o percentual do nível de ocupação como 83% (10/12) e determinar o percentual médio do nível de ocupação como 66% (por exemplo, (63 + 83 + 50 + 50 + 83) / 5 = 65,8). Para o sexto quadro, a CPU 6 pode determinar o percentual do nível de ocupação como 94% (15/16) e determinar o percentual médio do nível de ocupação como 72% (por exemplo, (83 + 50 + 50 + 83 + 94) / 5 = 72).
[0138] A figura 5 é um gráfico que ilustra o número de comandos que uma GPU deve executar durante um período de tempo. No exemplo do FTG. 5, a taxa de quadros é de 30 quadros por segundo e, conforme ilustrado, a carga de quadros, da qual o nível de ocupação pode ser derivado, da GPU 12 é aproximadamente constante a 24.000.
[0139] A figura 6A é um gráfico que ilustra uma determinação de percentual de nível de ocupação ao longo do período de tempo ilustrado na figura 5 utilizando uma técnica de exemplo. A figura 6B é um gráfico que ilustra uma determinação de percentual de nível de ocupação ao longo do período de tempo ilustrado na figura 5 utilizando outra técnica de exemplo. No exemplo da figura 6A, CPU 6 e / ou GPU 12 podem determinar a taxa de clock do sinal de clock do oscilador 34 com base no tempo de inatividade para inatividade da GPU 12, e no exemplo da figura 6B, CPU 6 e / ou GPU 12 podem determinar a taxa de clock do sinal de clock do oscilador 34 com base no fim-de-quadro para o fim-de- quadro. Como ilustrado, na figura 6A, a taxa de clock flutua. Contudo, na figura 6B, o clock é razoavelmente constante.
[0140] A figura 7 é um fluxograma ilustrando um método de exemplo de determinação de frequência de clock de acordo com técnicas descritas na presente invenção. Como descrito, as técnicas de exemplo podem ser realizadas pela CPU 6, GPU 12 ou uma combinação de CPU 6 e GPU 12. Por conseguinte, a figura 7 é descrito em relação a um processador. Um exemplo do processador é o CPU 6, um exemplo do processador é a GPU 12, e um exemplo do processador é uma combinação de CPU 6 e GPU 12.
[0141] Como ilustrado, um processador (por exemplo, CPU 6 e / ou GPU 12) determina uma primeira instância quando a GPU 12 completou a renderização de um primeiro quadro (50). A primeira instância de tempo compreende a instância quando a GPU 12 determinou os valores de pixel de um último pixel do primeiro quadro ou a instância quando a GPU 12 emitiu os valores de pixel do último pixel do primeiro quadro. O processador determina uma segunda instância de tempo quando a GPU 12 termina a renderização de um segundo quadro que precede imediatamente o quadro atual (52). A segunda instância de tempo compreende a instância quando a GPU 12 determinou os valores de pixel de um ultimo pixel do segundo quadro ou a instância quando a GPU 12 produziu os valores de pixel do ultimo pixel do segundo quadro.
[0142] Em alguns casos, a GPU 12 fica inativa por pelo menos uma parte durante a renderização do primeiro quadro. Além disso, em alguns casos, a GPU 12 cria o primeiro quadro imediatamente após a conclusão da renderização do segundo quadro, de modo que não haja tempo ocioso da GPU entre renderizar o segundo quadro e renderizar o primeiro quadro. A CPU 6 recebe uma solicitação de memória para renderizar um próximo quadro, e a CPU 6 determina a primeira ocorrência de tempo em resposta ao recebimento da solicitação da memória para renderização do próximo quadro.
[0143] O processador determina um intervalo de tempo baseado na primeira instância e na segunda instância de tempo (54). O processador determina um nível de ocupação de GPU 12 para renderizar o primeiro quadro durante o intervalo de tempo (56). Com base no nível de ocupação determinado, o processador pode definir uma frequência de GPU 12 (58).
[0144] Em alguns exemplos, o processador determina uma taxa de clock da GPU 12 com base no nível de ocupação determinado, e o processador define a taxa de clock da GPU 12 com base na taxa de clock determinada. Por exemplo, a CPU 6 pode instruir o controlador 30 para ajustar a taxa de clock do oscilador 34 ou o controlador 30 pode ajustar diretamente a taxa de clock do oscilador 34. O processador pode determinar o clock da GPU 12 com base no nível de ocupação determinado para renderizar o primeiro quadro e nenhum outro quadro.
[0145] Em alguns exemplos, o processador pode determinar um percentual de nível de ocupação com base no nível de ocupação determinado e no intervalo de tempo determinado, comparar o percentual de nível de ocupação com um limite e determinar a taxa de clock com base na comparação. Em alguns exemplos, o processador pode calcular a média do intervalo de tempo e um ou mais intervalos de tempo anteriores para determinar um intervalo de tempo médio, cada um dos intervalos de tempo anteriores indicando intervalos de tempo entre a conclusão da renderização dos respectivos quadros anteriores. O processador pode determinar uma porcentagem de nível de ocupação com base no nível de ocupação determinado e na interface de tempo médio, pode comparar a porcentagem do nível de ocupação com um limite e determinar a taxa de clock com base na comparação.
[0146] Em um ou mais exemplos, as funções descritas podem ser implementadas em hardware, software, firmware ou qualquer combinação das mesmas. Se implementado em software, as funções podem ser armazenadas em, como uma ou mais instruções ou código, um meio legível por computador e executado por uma unidade de processamento baseada em hardware. Mídia legível por computador pode incluir mídia de armazenamento legível por computador, que corresponde a um meio tangível, como mídia de armazenamento de dados. Deste modo, os meios legíveis por computador podem geralmente corresponder a meios de memória tangíveis, legíveis por computador, que são não transitórios. A mídia de armazenamento de dados pode ser qualquer mídia disponível que possa ser acessada por um ou mais computadores ou um ou mais processadores para recuperar instruções, código e / ou estruturas de dados para implementação das técnicas descritas na presente invenção. Um produto de programa de computador pode incluir um meio legível por computador.
[0147] A título de exemplo, e não limitativo, esses meios de armazenamento legíveis por computador podem compreender memória RAM, ROM, EEPROM, CD-ROM ou outro disco ótico de armazenamento, armazenamento em disco magnético ou outros dispositivos de armazenamento magnético, memória flash ou qualquer outro meio que pode ser usado para armazenar o código do programa desejado na forma de instruções ou estruturas de dados e que pode ser acessado por um computador. Deve ser entendido que meios de armazenamento de dados legíveis por computador e meios de armazenamento de dados não incluem ondas portadoras, sinais ou outros meios transitórios, mas são direcionados para meios de armazenamento tangíveis não transitórios. Disco e disco, como usado aqui, inclui disco compacto (CD), disco laser, disco óptico, disco versátil digital (DVD), disquete e disco Blu-ray, em que discos geralmente reproduzem dados magneticamente, enquanto discos reproduzem dados opticamente com lasers. Combinações dos itens acima também devem ser incluídas no escopo de mídia legível por computador.
[0148] As instruções podem ser executadas por um ou mais processadores, como um ou mais processadores de sinais digitais (DSPs), microprocessadores de uso geral, circuitos integrados de aplicação específica (ASICs), FPGAs (Field Programmable Leds Array) ou outras lógicas integradas ou circuitos discretos equivalentes. Por conseguinte, o termo "processador", como aqui utilizado, pode referir-se a qualquer uma das estruturas anteriores ou a qualquer outra estrutura adequada para implementação das técnicas aqui descritas. Além disso, em alguns aspectos, a funcionalidade aqui descrita pode ser fornecida dentro de módulos de hardware e / ou software dedicados configurados para codificação e decodificação, ou incorporados em um codec combinado. Além disso, as técnicas podem ser totalmente implementadas em um ou mais circuitos ou elementos lógicos.
[0149] As técnicas desta presente invenção podem ser implementadas numa ampla variedade de dispositivos ou dispositivos, incluindo um telefone sem fio, um circuito integrado (IC) ou um conjunto de CIs (por exemplo, um conjunto de chips). Vários componentes, módulos ou unidades são descritos na presente invenção para enfatizar aspectos funcionais de dispositivos configurados para executar as técnicas divulgadas, mas não necessariamente requerem realização por diferentes unidades de hardware. Pelo contrário, como descrito acima, várias unidades podem ser combinadas numa unidade de hardware codec ou proporcionadas por uma coleção de unidades de hardware interoperacionais, incluindo um ou mais processadores como descrito acima, em conjunto com software e / ou firmware adequados.
[0150] Vários exemplos foram descritos. Estes e outros exemplos estão dentro do escopo das seguintes reivindicações.

Claims (15)

1. Método para determinação da taxa de clock caracterizado pelo fato de que compreende: determinar, com um processador, uma primeira instância de tempo quando uma unidade de processamento gráfico (GPU) (12) completou a renderização de um primeiro quadro; determinar, com o processador, uma segunda instância de tempo quando a GPU (12) completou a renderização de um segundo quadro que precede imediatamente o primeiro quadro; determinar, com o processador, um intervalo de tempo baseado na primeira instância de tempo e na segunda instância de tempo, o intervalo de tempo sendo a diferença entre a primeira instância de tempo e a segunda instância de tempo; determinar, com o processador, um nível de ocupação da GPU (12) para renderizar o primeiro quadro durante o intervalo de tempo, em que o nível de ocupação indica a quantidade de tempo que a GPU (12) estava executando comandos para renderizar o primeiro quadro durante o intervalo de tempo, ou o número de ciclos de GPU (12) que foram usados durante o intervalo de tempo para renderizar o primeiro quadro; e definir uma taxa de clock da GPU (12) com base no nível de ocupação determinado.
2. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que a primeira instância de tempo compreende a instância quando a GPU (12) determinou valores de pixel de um último pixel do primeiro quadro ou a instância quando a GPU (12) emitiu os valores de pixel do último pixel do primeiro quadro, e em que segunda instância de tempo compreende a instância quando a GPU (12) determinou valores de pixel de um último pixel do segundo quadro ou a instância quando a GPU (12) emitiu os valores de pixel do último pixel do segundo quadro.
3. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que compreende adicionalmente: determinar uma taxa de clock da GPU (12) com base no nível de ocupação determinado, em que definir a taxa de clock compreende definir a taxa de clock para a taxa de clock determinada; ou em que a GPU (12) começa a renderização do primeiro quadro imediatamente após a conclusão da renderização do segundo quadro, de tal modo que não existe tempo ocioso da GPU (12) entre a renderização do segundo quadro e a renderização do primeiro quadro.
4. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que compreende adicionalmente: determinar um percentual de nível de ocupação com base no nível de ocupação determinado e no intervalo de tempo determinado; comparar o percentual do nível de ocupação com um limite; e determinar a taxa de clock com base na comparação, em que definir a taxa de clock compreende definir a taxa de clock da GPU (12) com base na taxa de clock determinada.
5. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que compreende adicionalmente: calcular a média do intervalo de tempo e um ou mais intervalos de tempo anteriores para determinar um intervalo de tempo médio, cada um dos um ou mais intervalos de tempo anteriores indicando intervalos de tempo entre a conclusão da renderização dos respectivos quadros anteriores; determinar um percentual de nível de ocupação com base no nível de ocupação determinado e no intervalo de tempo médio; comparar o percentual de nível de ocupação com um limite; e determinar a taxa de clock com base na comparação, em que definir a taxa de clock compreende definir a taxa de clock da GPU (12) com base na taxa de clock determinada; ou compreende adicionalmente determinar a taxa de clock da GPU (12) com base no nível de ocupação determinado para renderizar o primeiro quadro e mais nenhum quadro.
6. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que compreende adicionalmente: receber, a partir da GPU (12), um pedido de memória para renderizar um quadro seguinte, em que determinar a primeira instância de tempo compreende determinar a primeira instância de tempo em resposta ao recebimento do pedido da memória para renderizar o próximo quadro; ou em que o processador compreende um processador hospedeiro e em que definir a taxa de clock compreende instruir, com o processador hospedeiro, a GPU (12) para definir a taxa de clock.
7. Método, de acordo com a reivindicação 1, caracterizado pelo fato de que o processador compreende a GPU (12).
8. Dispositivo para determinação de taxa de clock caracterizado pelo fato de que compreende: memória configurada para armazenar dados gráficos que são usados por uma unidade de processamento gráfico (GPU) (12) para renderizar um primeiro quadro e um segundo quadro; e um processador que compreende circuitos integrados, o processador configurado para: determinar uma primeira instância de tempo quando a GPU (12) completou a renderização do primeiro quadro; determinar uma segunda instância de tempo quando a GPU (12) completou a renderização do segundo quadro; determinar um intervalo de tempo baseado na primeira instância de tempo e na segunda instância de tempo, o intervalo de tempo sendo a diferença entre a primeira instância de tempo e a segunda instância de tempo; determinar um nível de ocupação da GPU (12) para renderizar o primeiro quadro durante o intervalo de tempo; em que o nível de ocupação indica a quantidade de tempo que a GPU (12) estava executando comandos para renderizar o primeiro quadro durante o intervalo de tempo, ou o número de ciclos de GPU (12) que foram usados durante o intervalo de tempo para renderizar o primeiro quadro; e definir uma taxa de clock da GPU (12) com base no nível de ocupação determinado.
9. Dispositivo, de acordo com a reivindicação 8, caracterizado pelo fato de que a primeira instância de tempo compreende a instância quando a GPU (12) determinou valores de pixel de um último pixel do primeiro quadro ou a instância quando a GPU (12) emitiu os valores de pixel do último pixel do primeiro quadro, e em que a segunda instância de tempo compreende a instância quando a GPU (12) determinou valores de pixel de um último pixel do segundo quadro ou a instância quando a GPU (12) emitiu os valores de pixel do último pixel do segundo quadro.
10. Dispositivo, de acordo com a reivindicação 8, caracterizado pelo fato de que o processador é configurado para determinar uma taxa de clock da GPU (12) com base no nível de ocupação determinado, e em que para definir a taxa de clock, o processador é configurado para definir a taxa de clock para a taxa de clock determinada; ou em que a GPU (12) começa a renderizar o primeiro quadro imediatamente após a conclusão da renderização do segundo quadro, de tal modo que não há tempo ocioso da GPU (12) entre a renderização do segundo quadro e a renderização do primeiro quadro.
11. Dispositivo, de acordo com a reivindicação 8, caracterizado pelo fato de que o processador é configurado para: determinar um percentual de nível de ocupação com base no nível de ocupação determinado e no intervalo de tempo determinado; comparar o percentual de nível de ocupação com um limite; e determinar a taxa de clock com base na comparação, em que para definir a taxa de clock, o processador é configurado para definir a taxa de clock com base na taxa de clock determinada.
12. Dispositivo, de acordo com a reivindicação 8, caracterizado pelo fato de que o processador é configurado para: calcular a média do intervalo de tempo e um ou mais intervalos de tempo anteriores para determinar um intervalo de tempo médio, cada um dos um ou mais intervalos de tempo anteriores indicando intervalos de tempo entre a conclusão da renderização dos respectivos quadros anteriores; determinar um percentual de nível de ocupação com base no nível de ocupação determinado e no intervalo de tempo médio; comparar o percentual de nível de ocupação com um limite; e determinar a taxa de clock com base na comparação, em que, para definir a taxa de clock, o processador é configurado para definir a taxa de clock com base na taxa de clock determinada; ou em que o processador é configurado para determinar a taxa de clock da GPU (12) com base no nível de ocupação determinado para renderizar o primeiro quadro e nenhum outro quadro.
13. Dispositivo, de acordo com a reivindicação 8, caracterizado pelo fato de que o processador é configurado para: receber, a partir da GPU (12), um pedido de memória para renderizar um próximo quadro; em que para determinar a primeira instância de tempo, o processador é configurado para determinar a primeira instância de tempo em resposta ao recebimento do pedido de memória para renderizar o próximo quadro; ou em que o processador compreende um processador hospedeiro, e em que para definir a taxa de clock, o processador hospedeiro é configurado para instruir a GPU (12) para definir a taxa de clock.
14. Dispositivo, de acordo com a reivindicação 8, caracterizado pelo fato de que o processador compreende a GPU (12).
15. Memória legível por computador caracterizada pelo fato de que compreende instruções armazenadas na mesma, as instruções sendo executáveis por um computador para realizar as etapas do método conforme definido em qualquer uma das reivindicações 1 a 7.
BR112018015857-7A 2016-02-03 2016-12-15 Ajuste da taxa de clock baseado em quadro para unidade de processamento BR112018015857B1 (pt)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/014,727 2016-02-03
US15/014,727 US9817431B2 (en) 2016-02-03 2016-02-03 Frame based clock rate adjustment for processing unit
PCT/US2016/066993 WO2017136047A1 (en) 2016-02-03 2016-12-15 Frame based clock rate adjustment for processing unit

Publications (2)

Publication Number Publication Date
BR112018015857A2 BR112018015857A2 (pt) 2018-12-26
BR112018015857B1 true BR112018015857B1 (pt) 2023-07-25

Family

ID=

Similar Documents

Publication Publication Date Title
US9817431B2 (en) Frame based clock rate adjustment for processing unit
US11829197B2 (en) Backward compatibility through use of spoof clock and fine grain frequency control
US10007292B2 (en) Energy aware dynamic adjustment algorithm
EP3436894B1 (en) Active and stall cycle based dynamic scaling of processor frequency and bus bandwidth
US8587594B2 (en) Allocating resources based on a performance statistic
US20170199558A1 (en) Flexible and scalable energy model for estimating energy consumption
US8522254B2 (en) Programmable integrated processor blocks
KR20140138842A (ko) 그래픽스 프로세싱 유닛 상의 그래픽스 및 비그래픽스 어플리케이션들의 실행
WO2020264342A1 (en) Methods and apparatus for wave slot management
US9251557B2 (en) System, method, and computer program product for recovering from a memory underflow condition associated with generating video signals
BR112018015857B1 (pt) Ajuste da taxa de clock baseado em quadro para unidade de processamento
US20140136793A1 (en) System and method for reduced cache mode
US10043230B2 (en) Approach to reducing voltage noise in a stalled data pipeline
US10796399B2 (en) Pixel wait synchronization
US10817295B2 (en) Thread-level sleep in a multithreaded architecture