ES2834573T3 - Técnicas de ejecución serializada en un sistema de procesamiento SIMD - Google Patents

Técnicas de ejecución serializada en un sistema de procesamiento SIMD Download PDF

Info

Publication number
ES2834573T3
ES2834573T3 ES15719929T ES15719929T ES2834573T3 ES 2834573 T3 ES2834573 T3 ES 2834573T3 ES 15719929 T ES15719929 T ES 15719929T ES 15719929 T ES15719929 T ES 15719929T ES 2834573 T3 ES2834573 T3 ES 2834573T3
Authority
ES
Spain
Prior art keywords
instruction
threads
active
processing elements
processing
Prior art date
Legal status (The legal status 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 status listed.)
Active
Application number
ES15719929T
Other languages
English (en)
Inventor
Andrew Evan Gruber
Lin Chen
Yun Du
Alexei Vladimirovich Bourd
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Qualcomm Inc
Original Assignee
Qualcomm Inc
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
Application filed by Qualcomm Inc filed Critical Qualcomm Inc
Application granted granted Critical
Publication of ES2834573T3 publication Critical patent/ES2834573T3/es
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/3009Thread control instructions
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30145Instruction analysis, e.g. decoding, instruction word fields
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3888Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple threads [SIMT] in parallel

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Advance Control (AREA)
  • Executing Machine-Instructions (AREA)
  • Hardware Redundancy (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

Un procedimiento operativo en un procesador de instrucción única, datos múltiples, SIMD, comprendiendo el procedimiento: recibir una instrucción para realizar una operación divergente en el procesador SIMD; y determinar (152), como respuesta a una recepción de la instrucción para realizar una operación divergente en el procesador SIMD, una pluralidad de hilos activos de una pluralidad de hilos del procesador SIMD; seleccionar (154) un único hilo activo de la pluralidad determinada de hilos activos; y realizar (156) la operación divergente en el único hilo activo seleccionado mientras que todos los demás hilos activos ejecutan una condición de bifurcación.

Description

DESCRIPCIÓN
Técnicas de ejecución serializada en un sistema de procesamiento SIMD
CAMPO TÉCNICO
[0001] La divulgación se refiere al procesamiento multihilo y, más particularmente, a unas técnicas para una ejecución serializada en un único sistema de procesamiento de instrucción única, datos múltiples (SIMD).
ANTECEDENTES
[0002] Un sistema de procesamiento de instrucción única, datos múltiples (SIMD) es una clase de sistemas informáticos paralelos que incluye múltiples elementos de procesamiento que ejecutan la misma instrucción en múltiples datos. Un sistema SIMD puede ser un ordenador o un subsistema autónomo de un sistema informático. Por ejemplo, se pueden usar una o más unidades de ejecución SIMD en una unidad de procesamiento de gráficos (GPU) para implementar una unidad de sombreado programable que admite sombreado programable.
[0003] Un sistema de procesamiento SIMD permite que múltiples hilos de ejecución para un programa se ejecuten sincrónicamente en los múltiples elementos de procesamiento de una manera paralela, incrementándose de este modo el rendimiento para programas donde es necesario realizar el mismo conjunto de operaciones en múltiples datos. En algunas situaciones, puede ser deseable realizar uno o más hilos en serie. Eso sucede, por ejemplo, en una situación donde la salida de un hilo se necesita como entrada para uno o más de otros hilos. La ejecución de operaciones en serie en un SIMD puede consumir muchos recursos y ser ineficaz.
[0004] En el documento US 2011/0078690 A1, se expone una técnica para realizar un procedimiento para sincronizar hilos de ejecución divergente. El procedimiento incluye recibir una pluralidad de instrucciones que incluye al menos una instrucción de sincronización de conjuntos y al menos una instrucción que incluye un mandato de sincronización, y determinar una máscara activa que indica qué hilos de una pluralidad de hilos están activos y qué hilos de la pluralidad de hilos están inhabilitados. Para cada instrucción incluida en la pluralidad de instrucciones, la instrucción se transmite a cada uno de los hilos activos incluidos en la pluralidad de hilos. Si la instrucción es una instrucción de sincronización de conjuntos, entonces un testigo de sincronización, la máscara activa y el punto de sincronización se insertan cada uno en una pila. O, si la instrucción es una instrucción de predicados que incluye un mandato de sincronización, entonces se realiza un seguimiento de cada hilo activo que ejecuta la instrucción de predicados para determinar cuándo se ha actualizado la máscara activa para indicar que cada hilo activo se ha inhabilitado después de ejecutar la instrucción de predicados.
BREVE EXPLICACIÓN
[0005] Esta divulgación describe técnicas para realizar una operación serializada en un sistema de procesamiento SIMD. En unos ejemplos de la divulgación, se propone una instrucción ejecutada por hardware que selecciona un hilo de una pluralidad de hilos activos para ejecutar una instrucción en serie. La instrucción puede seleccionar un hilo sin comprobar los ID de hilo ni usar instrucciones para bloquear una variable compartida. Así pues, las operaciones en serie se pueden realizar rápida y eficazmente, con un impacto mínimo en los recursos del sistema.
[0006] La invención se define mediante las reivindicaciones, hacia las cuales se dirige la atención del lector.
[0007] En un ejemplo de la divulgación, un procesador multihilo configurado para realizar operaciones divergentes comprende una unidad de control configurada para determinar uno o más hilos activos de una pluralidad de hilos, y para seleccionar un hilo activo del uno o más hilos activos, y una pluralidad de elementos de procesamiento, en el que un elemento de procesamiento de la pluralidad de elementos de procesamiento asociado con el hilo activo seleccionado se configura para realizar una operación divergente.
[0008] En otro ejemplo de la divulgación, un aparato configurado para realizar operaciones divergentes en un procesador multihilo comprende medios para determinar uno o más hilos activos de una pluralidad de hilos, medios para seleccionar un hilo activo del uno o más hilos activos, y medios para realizar una operación divergente en el hilo activo seleccionado.
[0009] En otro ejemplo de la divulgación, un aparato configurado para realizar operaciones divergentes comprende un procesador multihilo que comprende una unidad de control configurada para determinar uno o más hilos activos de una pluralidad de hilos, y para seleccionar un hilo activo del uno o más hilos activos, y una pluralidad de elementos de procesamiento, en el que un elemento de procesamiento de la pluralidad de elementos de procesamiento asociado con el hilo activo seleccionado se configura para realizar una operación divergente.
[0010] En otro ejemplo de la divulgación, un procedimiento para realizar operaciones divergentes en un procesador multihilo comprende determinar uno o más hilos activos de una pluralidad de hilos, seleccionar un hilo activo del uno o más hilos activos y realizar una operación divergente en el hilo activo seleccionado.
[0011] Los detalles de uno o más ejemplos de la divulgación se exponen en los dibujos adjuntos y en la descripción proporcionada a continuación. Otras características, objetivos y ventajas de la divulgación serán evidentes a partir de la descripción y dibujos, y a partir de las reivindicaciones.
BREVE DESCRIPCIÓN DE LOS DIBUJOS
[0012]
La FIG. 1 es un diagrama de bloques que ilustra dispositivo que se puede configurar para implementar las técnicas de esta divulgación.
La FIG. 2 es un diagrama de bloques que ilustra un ejemplo de unidad de procesamiento de gráficos (GPU) que se puede configurar para implementar las técnicas de esta divulgación.
La FIG. 3 es un diagrama de bloques que ilustra la unidad de control del ejemplo de GPU de la FIG. 2 en mayor detalle.
La FIG. 4 es un diagrama de flujo que muestra las técnicas de operaciones serializadas de esta divulgación.
La FIG. 5 es un diagrama de flujo que ilustra un ejemplo de procedimiento de las técnicas de esta divulgación.
DESCRIPCIÓN DETALLADA
[0013] Esta divulgación describe técnicas para realizar operaciones en serie en un sistema de procesamiento SIMD (por ejemplo, una GPU). Las técnicas convencionales para realizar operaciones en serie en sistemas de procesamiento SIMD pueden consumir muchos recursos y ser ineficaces. Esta divulgación propone una instrucción (por ejemplo, ejecutada mediante hardware en un procesador SIMD) que selecciona un hilo activo de una pluralidad de hilos activos para realizar la operación en serie, sin repetirse en bucle en todos los hilos inactivos. Esto puede dar lugar a una operación en serie más eficaz en un sistema de procesamiento SIMD.
[0014] La FIG. 1 es un diagrama de bloques que ilustra un ejemplo de dispositivo que puede implementar las técnicas de esta divulgación para la ejecución serializada en un sistema de procesamiento SIMD. La FIG. 1 ilustra un dispositivo 10 que incluye una GPU 12, una memoria de sistema 14 y un procesador 16, que puede ser una unidad central de procesamiento (CPU). Los ejemplos del dispositivo 10 incluyen, pero no se limitan a, dispositivos de vídeo, tales como reproductores de medios, receptores de televisión, teléfonos inalámbricos, tales como teléfonos móviles, asistentes personales digitales (PDA), ordenadores de escritorio, ordenadores portátiles, consolas de videojuegos, unidades de videoconferencia, dispositivos informáticos de tableta y similares. El dispositivo 10 puede incluir otros componentes además de los ilustrados en la FIG. 1.
[0015] La memoria de sistema 14 se puede considerar la memoria para el dispositivo 10. La memoria de sistema 14 puede comprender uno o más medios de almacenamiento legibles por ordenador. Los ejemplos de la memoria de sistema 14 incluyen, pero no se limitan a, una memoria de acceso aleatorio (RAM), una memoria de solo lectura programable y borrable eléctricamente (EEPROM), una memoria flash o cualquier otro medio que se pueda usar para transportar o almacenar un código de programa deseado en forma de estructuras de instrucciones y/o de datos y al que se pueda acceder mediante un ordenador o un procesador.
[0016] En algunos aspectos, la memoria de sistema 14 puede incluir instrucciones que hacen que el procesador 16 y/o la GPU 12 realicen las funciones atribuidas al procesador 16 y la GPU 12 en esta divulgación. En consecuencia, la memoria de sistema 14 puede ser un medio de almacenamiento legible por ordenador que tiene instrucciones almacenadas en el mismo que, cuando se ejecutan, hacen que uno o más procesadores (por ejemplo, el procesador 16 y la GPU 12) realicen diversas funciones.
[0017] En algunos ejemplos, la memoria de sistema 14 se puede considerar un medio de almacenamiento no transitorio. El término "no transitorio" puede indicar que el medio de almacenamiento no se realiza ni en una onda portadora ni en una señal propagada. Sin embargo, el término "no transitorio" no se debería interpretar en el sentido de que la memoria de sistema 14 es fija o que su contenido es estático. Como ejemplo, la memoria de sistema 14 se puede retirar del dispositivo 10 y trasladar a otro dispositivo. Como otro ejemplo, la memoria, sustancialmente similar a la memoria de sistema 14, se puede insertar en el dispositivo 10. En determinados ejemplos, un medio de almacenamiento no transitorio puede almacenar (por ejemplo, en una RAM) datos que pueden cambiar a lo largo del tiempo.
[0018] En algunos ejemplos, tales como ejemplos donde el dispositivo 10 es un dispositivo telefónico de comunicación inalámbrica, un procesador 16 y una GPU 12 se pueden conformar como un circuito integrado (IC). Por ejemplo, el IC se puede considerar como un chip de procesamiento dentro de un paquete de chips. En algunos ejemplos, el procesador 16 y la GPU 12 se pueden alojar en diferentes circuitos integrados (es decir, diferentes paquetes de chips) tales como en ejemplos donde el dispositivo 10 es un ordenador de escritorio o un ordenador portátil. Sin embargo, cabe la posibilidad de que el procesador 16 y la GPU 12 estén alojados en diferentes circuitos integrados en ejemplos donde el dispositivo 10 es un dispositivo telefónico de comunicación inalámbrica.
[0019] Los ejemplos del procesador 16 y de la GPU 12 incluyen, pero no se limitan a, un procesador de señales digitales (DSP), un microprocesador de propósito general, un circuito integrado específico de la aplicación (ASIC), un matriz lógica programable in situ (FPGA) u otros circuitos lógicos integrados o discretos equivalentes. En algunos ejemplos, la GPU 12 puede ser hardware especializado que incluye circuitos lógicos integrados y/o discretos que proporcionan a la GPU 12 capacidades de procesamiento paralelo masivas adecuadas para el procesamiento de gráficos. En algunos casos, la GPU 12 también puede incluir capacidades de procesamiento de propósito general, y se puede denominar GPU de propósito general (GPGPU) cuando implementa tareas de procesamiento de propósito general (es decir, tareas no relacionadas con gráficos).
[0020] El procesador 16 puede ejecutar diversos tipos de aplicaciones. Los ejemplos de las aplicaciones incluyen navegadores web, aplicaciones de correo electrónico, hojas de cálculo, videojuegos u otras aplicaciones que generan objetos visibles para su presentación. Las instrucciones para la ejecución de la una o más aplicaciones se pueden almacenar en la memoria de sistema 14. El procesador 16 puede transmitir datos de gráficos de los objetos visibles a la GPU 12 para un procesamiento adicional.
[0021] En general, el procesador 16 puede descargar, a la GPU 12, tareas de procesamiento, tales como tareas que requieren operaciones paralelas masivas. Como ejemplo, el procesamiento de gráficos requiere operaciones paralelas masivas, y el procesador 16 puede descargar dichas tareas de procesamiento de gráficos en la GPU 12. El procesador 16 se puede comunicar con la GPU 12 de acuerdo con una interfaz de procesamiento de aplicaciones (API) particular. Los ejemplos de dichas API incluyen la API DirectX® de Microsoft®, la API OpenGL® del grupo Khronos y la API OpenCL™; sin embargo, los aspectos de la presente divulgación no están limitados a las API DirectX, OpenGL u OpenCL, sino que se pueden ampliar a otros tipos de API. Además, no se requiere que las técnicas descritas en la presente divulgación funcionen de acuerdo con una API, y el procesador 16 y la GPU 12 pueden utilizar cualquier técnica para la comunicación.
[0022] Para realizar operaciones de gráficos, la GPU 12 puede implementar una canalización de procesamiento de gráficos. La canalización de procesamiento de gráficos incluye realizar funciones como se define mediante el software o el firmware que se ejecutan en la GPU 12 y realizar funciones mediante unidades de función fija que están cableadas para realizar funciones muy específicas. El software o el firmware que se ejecuta en la GPU 12 se puede denominar programa sombreador (o simplemente sombreador), y los programas sombreadores se pueden ejecutar en uno o más núcleos sombreadores de la GPU 12. Los programas sombreadores proporcionan flexibilidad funcional a los usuarios, para que los usuarios puedan diseñar el programa sombreador para que realice las tareas deseadas de cualquier manera concebible. Sin embargo, las unidades de función fija están cableadas por la manera en cual las unidades de función fija realizan las tareas. En consecuencia, las unidades de función fija pueden no proporcionar mucha flexibilidad funcional.
[0023] Por ejemplo, el procesador 16 puede ejecutar una aplicación, tal como un videojuego, y el procesador 16 puede generar datos de gráficos como parte de la ejecución. El procesador 16 puede generar los datos de gráficos para su procesamiento por la GPU 12. La GPU 12 puede, a continuación, procesar los datos de gráficos en la canalización de gráficos. En algunos ejemplos, para procesar los datos de gráficos, puede ser necesario que la GPU 12 ejecute uno o más programas sombreadores. Por ejemplo, la aplicación que se ejecuta en el procesador 16 puede hacer que el procesador 16 ordene a la GPU 12 que recupere un programa sombreador de la memoria de sistema 14 y ordene a la GPU 12 que ejecute el programa sombreador.
[0024] El dispositivo 10 también puede incluir opcionalmente la pantalla 60, la interfaz de usuario 62 y el módulo transceptor 64. El dispositivo 10 puede incluir módulos o unidades adicionales no mostrados en la FIG. 1 con propósitos de mayor claridad. Por ejemplo, el dispositivo 10 puede incluir un altavoz y un micrófono, ninguno de los cuales se muestra en la FIG. 1, para efectuar comunicaciones telefónicas en ejemplos donde el dispositivo 10 es un teléfono móvil inalámbrico. Además, los diversos módulos y unidades mostrados en el dispositivo 10 pueden no ser necesarios en cada ejemplo del dispositivo 10. Por ejemplo, la interfaz de usuario 62 y la pantalla 60 pueden ser externas al dispositivo 10 en ejemplos donde el dispositivo 10 es un ordenador de escritorio. Como otro ejemplo, la interfaz de usuario 62 puede formar parte de la pantalla 60 en ejemplos donde la pantalla 60 es una pantalla sensible al tacto o sensible a la presencia de un dispositivo móvil.
[0025] Los ejemplos de interfaz de usuario 62 incluyen, pero no se limitan a, una rueda de desplazamiento, un ratón, un teclado y otros tipos de dispositivos de entrada. La interfaz de usuario 62 también puede ser una pantalla táctil y se puede incorporar como parte de la pantalla 60. El módulo transceptor 64 puede incluir circuitos para permitir la comunicación inalámbrica o alámbrica entre el dispositivo 10 y otro dispositivo o una red. El módulo transceptor 64 puede incluir moduladores, desmoduladores, amplificadores y otros circuitos de este tipo para la comunicación alámbrica o inalámbrica. La pantalla 60 puede comprender una pantalla de cristal líquido (LCD), una pantalla de tubo de rayos catódicos (CRT), una pantalla de plasma, una pantalla sensible al tacto, una pantalla sensible a la presencia u otro tipo de dispositivo de visualización.
[0026] Como se explicará con mayor detalle a continuación, de acuerdo con las técnicas de la divulgación, la GPU 12 se puede configurar para realizar un procedimiento de realización de operaciones divergentes en un procesador multihilo. La GPU 12 se puede configurar para determinar uno o más hilos activos de una pluralidad de hilos, seleccionar un hilo activo de entre el uno o más hilos activos y realizar una operación divergente en el hilo activo seleccionado.
[0027] La FIG. 2 es un diagrama de bloques que ilustra un ejemplo de configuración de la GPU 12 que se puede usar para implementar las técnicas para procesamiento en serie de esta divulgación. La GPU 12 se configura para ejecutar instrucciones para un programa de manera paralela. La GPU 12 incluye una unidad de control 72, unos elementos de procesamiento 74A-74D (denominados conjuntamente "elementos de procesamiento 74"), un almacén de instrucciones 76, un almacén de datos 78 y unas rutas de comunicación 80, 82, 84, 86A-86D. Las rutas de comunicación 86A-86D se pueden denominar conjuntamente "rutas de comunicación 86," En algunos ejemplos, la GPU 12 se puede configurar como un sistema de procesamiento de instrucción única, datos múltiples (SIMD) que se configura para ejecutar una pluralidad de hilos de ejecución para un programa usando los elementos de procesamiento 74. En dicho sistema SIMD, los elementos de procesamiento 74 pueden procesar juntos una única instrucción a la vez con respecto a diferentes elementos de datos. El programa se puede retirar después de que todos los hilos asociados con el programa terminen la ejecución.
[0028] La unidad de control 72 se configura para controlar la GPU 12 para que ejecute instrucciones para un programa almacenado en el almacén de instrucciones 76. Para cada instrucción del programa, la unidad de control 72 puede recuperar la instrucción del almacén de instrucciones 76 por medio de la ruta de comunicación 80, y procesar la instrucción. En algunos ejemplos, la unidad de control 72 puede procesar la instrucción haciendo que una operación asociada con la instrucción se ejecute en uno o más de los elementos de procesamiento 74. Por ejemplo, la instrucción recuperada por la unidad de control 72 puede ser una instrucción aritmética que ordena a la GPU 12 que realice una operación aritmética con respecto a los elementos de datos especificados por la instrucción, y la unidad de control 72 puede hacer que uno o más de los elementos de procesamiento 74 realicen la operación aritmética en los elementos de datos especificados. En otros ejemplos, la unidad de control 72 puede procesar la instrucción sin hacer que se realice una operación en los elementos de procesamiento 74.
[0029] La unidad de control 72 puede hacer que se realice una operación en uno o más de los elementos de procesamiento 74 proporcionando una instrucción a los elementos de procesamiento 74 por medio de la ruta de comunicación 82. La instrucción puede especificar la operación que se va a realizar mediante los elementos de procesamiento 74. La instrucción proporcionada al uno o más de los elementos de procesamiento 74 puede ser igual o diferente a la instrucción recuperada del almacén de instrucciones 76. En algunos ejemplos, la unidad de control 72 puede hacer que la operación se realice en un subconjunto particular de elementos de procesamiento 74 (incluyendo en un único elemento de procesamiento) mediante una o ambas de una activación de un subconjunto particular de los elementos de procesamiento 74 tras la cual se debería realizar la operación y una desactivación de otro subconjunto de elementos de procesamiento 74 tras la cual no se debería realizar la operación. La unidad de control 72 puede activar y/o desactivar los elementos de procesamiento 74 proporcionando señales de activación y/o desactivación respectivas a cada uno de los elementos de procesamiento 74 por medio de la ruta de comunicación 82. En algunos ejemplos, la unidad de control 72 puede activar y/o desactivar elementos de procesamiento 74 proporcionando señales de activación y/o desactivación a los elementos de procesamiento 74 y conjuntamente proporcionar una instrucción a los elementos de procesamiento 74. En otros ejemplos, la unidad de control 72 puede activar y/o desactivar los elementos de procesamiento 74 antes de proporcionar una instrucción a los elementos de procesamiento 74.
[0030] La unidad de control 72 puede ejecutar una pluralidad de hilos de ejecución para un programa usando elementos de procesamiento 74. Una pluralidad de hilos que se van a ejecutar en paralelo a veces se denomina onda. Cada uno de los elementos de procesamiento 74 se puede configurar para procesar instrucciones del programa para un hilo respectivo de la pluralidad de hilos. Por ejemplo, la unidad de control 72 puede asignar cada hilo de ejecución a uno individual de los elementos de procesamiento 74 para su procesamiento. Los hilos de ejecución para el programa pueden ejecutar el mismo conjunto de instrucciones con respecto a diferentes elementos de datos de un conjunto de elementos de datos. Por ejemplo, el elemento de procesamiento 74A puede ejecutar un primer hilo de ejecución para un programa almacenado en el almacén de instrucciones 76 con respecto a un primer subconjunto de elementos de datos de una pluralidad de elementos de datos, y el elemento de procesamiento 74B puede ejecutar un segundo hilo de ejecución para el programa almacenado en el almacén de instrucciones 76 con respecto a un segundo subconjunto de elementos de datos de la pluralidad de elementos de datos. El primer hilo de ejecución puede incluir las mismas instrucciones que el segundo hilo de ejecución, pero el primer subconjunto de elementos de datos puede ser diferente del segundo subconjunto de elementos de datos.
[0031] En algunos ejemplos, la unidad de control 72 puede activar y desactivar hilos individuales de la pluralidad de hilos de ejecución. Cuando la unidad de control 72 desactiva un hilo, la unidad de control 72 también puede desactivar y/o inhabilitar el elemento de procesamiento 74A-74D que se ha asignado para ejecutar el hilo. Dichos hilos desactivados se pueden denominar hilos inactivos. De forma similar, cuando la unidad de control 72 activa un hilo, la unidad de control 72 también puede activar el elemento de procesamiento 74A-74D que se ha asignado para ejecutar el hilo. Dichos hilos activados se pueden denominar hilos activos. Como se explicará con más detalle a continuación, la unidad de control 72 se puede configurar para seleccionar un hilo de activación para ejecutar una operación divergente (por ejemplo, una operación en serie), sin necesidad de considerar otros hilos activos o inactivos.
[0032] Como se usa en el presente documento, un hilo activo se puede referir a un hilo que está activado, y un hilo inactivo se puede referir a un hilo que está desactivado. Para una pluralidad de hilos que se ejecutan en la GPU 12 durante un ciclo de procesamiento dado, cada uno de los hilos activos se puede configurar para procesar una instrucción del programa identificado mediante un registro de contador de programa global para la pluralidad de hilos durante el ciclo de procesamiento. Por ejemplo, la unidad de control 72 puede activar los elementos de procesamiento 74 que están asignados a hilos activos para configurar dichos elementos de procesamiento 74 para procesar la instrucción del programa durante el ciclo de procesamiento. Por otra parte, para una pluralidad de hilos que se ejecutan en la GPU 12 durante un ciclo de procesamiento dado, cada uno de los hilos inactivos se puede configurar para no procesar la instrucción del programa durante el ciclo de procesamiento. Por ejemplo, la unidad de control 72 puede desactivar los elementos de procesamiento 74 que están asignados a hilos inactivos para configurar dichos elementos de procesamiento 74 para que no procesen la instrucción del programa durante el ciclo de procesamiento.
[0033] En algunos ejemplos, un ciclo de procesamiento se puede referir al intervalo de tiempo entre cargas sucesivas del contador de programa. Por ejemplo, un ciclo de procesamiento se puede referir al tiempo entre el momento en que el contador de programa se carga con un primer valor y el momento en que el contador de programa se carga con un segundo valor. El primer y el segundo valores pueden ser valores iguales o diferentes. En los ejemplos donde el contador del programa se carga de manera asíncrona debido a unas técnicas de comprobación de reanudación, dichas cargas asíncronas pueden no servir, en algunos ejemplos, para diferenciar los ciclos de procesamiento. En otras palabras, en dichos ejemplos, un ciclo de procesamiento se puede referir al intervalo de tiempo entre cargas síncronas sucesivas del contador de programa. Una carga síncrona del contador de programa se puede referir, en algunos ejemplos, a una carga que se desencadena mediante una señal de reloj.
[0034] En algún momento antes de la recuperación de la siguiente instrucción, la unidad de control 72 determina una siguiente instrucción que la GPU 12 va a procesar. La manera en que la unidad de control 72 determina la siguiente instrucción que se va a procesar es diferente dependiendo de si la instrucción recuperada previamente por la GPU 12 es una instrucción de flujo de control. Si la instrucción recuperada previamente por la GPU 12 no es una instrucción de flujo de control, la unidad de control 72 puede determinar que la siguiente instrucción que la GPU 12 va a procesar corresponde a una siguiente instrucción secuencial almacenada en el almacén de instrucciones 76. Por ejemplo, el almacén de instrucciones 76 puede almacenar las instrucciones para un programa en una secuencia ordenada, y la siguiente instrucción secuencial puede ser una instrucción que se produce inmediatamente después de la instrucción recuperada previamente.
[0035] Si la instrucción recuperada previamente por la GPU 12 es una instrucción de flujo de control, la unidad de control 72 puede determinar la siguiente instrucción que la GPU 12 va a procesar en base a información especificada en la instrucción de flujo de control. Por ejemplo, la instrucción de flujo de control puede ser una instrucción de flujo de control incondicional, por ejemplo, una instrucción de bifurcación incondicional o una instrucción de salto, en cuyo caso la unidad de control 72 puede determinar que la próxima instrucción que la GPU 12 va a procesar es una instrucción de destino identificada por la instrucción de flujo de control. Como otro ejemplo, la instrucción de flujo de control puede ser una instrucción de flujo de control condicional, por ejemplo, una instrucción de bifurcación condicional, en cuyo caso la unidad de control 72 puede seleccionar una de una instrucción de destino identificada por la instrucción de flujo de control o una siguiente instrucción secuencial almacenada en el almacén de instrucciones 76 como la próxima instrucción que se va a procesar del almacén de instrucciones 76.
[0036] Como se usa en el presente documento, una instrucción de flujo de control se puede referir a una instrucción que incluye información que identifica una instrucción de destino en el almacén de instrucciones 76. Por ejemplo, la instrucción de flujo de control puede incluir un valor de destino indicativo de un valor de contador de programa de destino para la instrucción de flujo de control. El valor del contador de programa de destino puede ser indicativo de una dirección de destino para la instrucción de destino. La instrucción de destino puede, en algunos ejemplos, ser diferente de la siguiente instrucción secuencial almacenada en el almacén de instrucciones 76. Un código de programa de alto nivel puede incluir sentencias de flujo de control tales como, por ejemplo, if, switch, do, for, while, continue, break y goto. Un compilador puede traducir las sentencias de flujo de control de alto nivel en instrucciones de flujo de control de bajo nivel, por ejemplo, nivel de máquina. Una instrucción que no es una instrucción de flujo de control se puede denominar en el presente documento instrucción secuencial. Por ejemplo, una instrucción secuencial puede no incluir información que identifica una instrucción de destino.
[0037] Para instrucciones de flujo de control, la información que identifica la instrucción de destino puede ser un valor indicativo de una instrucción de destino almacenada en el almacén de instrucciones 76. En algunos ejemplos, el valor indicativo de la instrucción de destino del almacén de instrucciones 76 puede ser un valor indicativo de la dirección de instrucción de la instrucción de destino en el almacén de instrucciones 76. El valor indicativo de la dirección de instrucción de la instrucción de destino puede ser, en algunos casos, la dirección de la instrucción de destino en el almacén de instrucciones 76. El valor indicativo de la dirección de instrucción de la instrucción de destino puede, en casos adicionales, ser un valor usado para calcular la dirección de la instrucción de destino. En otros ejemplos, el valor indicativo de la dirección de instrucción de la instrucción de destino puede ser un valor indicativo de un valor de contador de programa de destino que corresponde a la instrucción de destino. El valor indicativo del valor del contador de programa de destino puede ser, en algunos casos, el valor del contador de programa de destino que corresponde a la instrucción de destino. El valor indicativo del valor del contador de programa de destino puede, en casos adicionales, ser un valor usado para calcular el valor del contador de programa de destino. El valor del contador de programa de destino que corresponde a la instrucción de destino puede ser, en algunos ejemplos, igual a la dirección de la instrucción de destino.
[0038] Una instrucción de flujo de control puede ser una instrucción de flujo de control avanzada o una instrucción de flujo de control atrasada. Una instrucción de flujo de control avanzada puede ser una instrucción de flujo de control donde la instrucción de destino se produce después de la instrucción de flujo de control en la secuencia ordenada de instrucciones almacenadas en el almacén de instrucciones 76. Una instrucción de flujo de control atrasada puede ser una instrucción de flujo de control donde la instrucción de destino se produce antes de la siguiente instrucción secuencial en la secuencia ordenada de instrucciones almacenadas en el almacén de instrucciones 76. La siguiente instrucción secuencial se puede producir inmediatamente después de la instrucción de flujo de control en la secuencia ordenada de instrucciones.
[0039] Una instrucción de flujo de control puede ser una instrucción de flujo de control condicional o una instrucción de flujo de control incondicional. Una instrucción de flujo de control condicional incluye información que especifica una condición para saltar a la instrucción de destino asociada con la instrucción de flujo de control. Si al procesar una instrucción de flujo de control condicional la unidad de control 72 determina que se cumple la condición, la unidad de control 72 puede determinar que la siguiente instrucción que se va a procesar es la instrucción de destino. Por otra parte, si la unidad de control 72 determina que la condición no se cumple, la unidad de control 72 puede determinar que la siguiente instrucción que se va a procesar es la siguiente instrucción secuencial almacenada en el almacén de instrucciones 76. Una instrucción de flujo de control incondicional no incluye información que especifica una condición para saltar a la instrucción de destino asociada con la instrucción de flujo de control. Al procesar una instrucción de flujo de control incondicional, la unidad de control 72 puede determinar incondicionalmente que la siguiente instrucción que se va a procesar es la instrucción de destino identificada por la instrucción de flujo de control. En otras palabras, la determinación en dicho caso no está condicionada a ninguna condición especificada en la instrucción de flujo de control incondicional. Como se usa en el presente documento, una instrucción de flujo de control de condición se puede denominar en el presente documento instrucción de bifurcación a menos que la instrucción de bifurcación se designe de otro modo como una instrucción de bifurcación incondicional. Además, una instrucción de flujo de control incondicional se puede denominar en el presente documento instrucción de salto.
[0040] Una instrucción de bifurcación condicional puede incluir condiciones que se especifican con respecto a uno o más valores de elementos de datos. Por ejemplo, un tipo de condición puede ser una condición de comparación que compara un primer valor de elemento de datos con un segundo valor de elemento de datos para cada hilo activo que se ejecuta en la GPU 12. Comparar los valores de elementos de datos puede incluir, por ejemplo, determinar si el primer valor del elemento de datos es mayor, menor, no mayor, no menor, igual o no igual que el segundo valor de elemento de datos. Otro tipo de condición puede ser una condición de comprobación de cero que determina si un valor de elemento de datos para cada hilo activo que se ejecuta en la GPU 12 es igual o no igual a cero. Debido a que cada uno de los elementos de procesamiento 74 opera en diferentes elementos de datos, el resultado de evaluar la condición puede ser diferente para cada hilo activo que se ejecuta en la GPU 12.
[0041] Si todos los hilos activos que se ejecutan en la GPU 12 satisfacen la condición de bifurcación o todos los hilos activos que se ejecutan en la GPU 12 no satisfacen la condición de bifurcación, se produce una condición de bifurcación uniforme y se dice que la divergencia de bifurcación para los hilos es uniforme. Por otra parte, si al menos uno de los hilos activos que se ejecutan en la GPU 12 satisface la condición de bifurcación y al menos uno de los hilos activos que se ejecutan en la GPU 12 no cumple la condición de bifurcación, se produce una condición de bifurcación divergente y se dice que la divergencia de bifurcación para los hilos es divergente.
[0042] Un ejemplo de operación divergente es una operación en serie. Una operación en serie (o una serie de operaciones en serie) es una operación donde la salida de un hilo (por ejemplo, de la operación en serie) se necesita como la entrada para uno o más de otros hilos. Es decir, otros hilos pueden no continuar procesándose en paralelo hasta que la salida de uno o más de otros hilos se termina. En este sentido, los hilos de un dispositivo SIMD pueden funcionar en serie durante un período de tiempo.
[0043] Típicamente, los hilos que se ejecutan en la GPU 12 pueden ejecutar la misma instrucción al unísono. En otras palabras, cada uno de los elementos de procesamiento 74 puede ejecutar conjuntamente la misma instrucción para todos los hilos activos durante un ciclo de procesamiento. Sin embargo, cuando se produce una condición de bifurcación divergente, los hilos que cumplen esa condición de bifurcación se pueden programar para ejecutar unas siguientes instrucciones que son diferentes de las siguientes instrucciones planificadas para su ejecución por los hilos que no cumplen la condición de bifurcación. Como se analiza anteriormente, una de dichas condiciones de bifurcación divergente puede ser una operación en serie.
[0044] La unidad de control 72 está acoplada comunicativamente al almacén de instrucciones 76 por medio de la ruta de comunicación 800, a los elementos de procesamiento 74 por medio de la ruta de comunicación 82, y al almacén de datos 78 por medio de la ruta de comunicación 84. La unidad de control 72 puede usar la ruta de comunicación 800 para enviar instrucciones de lectura al almacén de instrucciones 76. Una instrucción de lectura puede especificar una dirección de instrucción en el almacén de instrucciones 76 desde la cual se debería recuperar una instrucción. La unidad de control 72 puede recibir una o más instrucciones de programa del almacén de instrucciones 76 como respuesta al envío de la instrucción de lectura. La unidad de control 72 puede usar la ruta de comunicación 82 para proporcionar instrucciones a los elementos de procesamiento 74 y, en algunos ejemplos, para recibir datos desde los elementos de procesamiento 74, por ejemplo, el resultado de una instrucción de comparación para evaluar una condición de bifurcación. En algunos ejemplos, la unidad de control 72 puede usar la ruta de comunicación 84 para recuperar valores de elementos de datos del almacén de datos 78, por ejemplo, para determinar una condición de bifurcación. Aunque en la FIG. 2 la GPU 12 ilustrada incluye una ruta de comunicación 84, en otros ejemplos, la GPU 12 puede no incluir una ruta de comunicación 84.
[0045] Cada uno de los elementos de procesamiento 74 se puede configurar para procesar instrucciones para el programa almacenado en el almacén de instrucciones 76. En algunos ejemplos, cada uno de los elementos de procesamiento 74 se puede configurar para realizar el mismo conjunto de operaciones. Por ejemplo, cada uno de los elementos de procesamiento 74 puede implementar la misma arquitectura de conjunto de instrucciones (ISA). En ejemplos adicionales, cada uno de los elementos de procesamiento 74 puede ser una unidad aritmética lógica (ALU). En otros ejemplos, la GPU 12 se puede configurar como un procesador vectorial, y cada uno de los elementos de procesamiento 74 puede ser un elemento de procesamiento dentro del procesador vectorial. En ejemplos adicionales, la GPU 12 puede ser una unidad de ejecución SIMD, y cada uno de los elementos de procesamiento 74 puede ser un elemento de procesamiento SIMD dentro de la unidad de ejecución SIMD.
[0046] Las operaciones realizadas por los elementos de procesamiento 74 pueden incluir operaciones aritméticas, operaciones lógicas, operaciones de comparación, etc. Las operaciones aritméticas pueden incluir operaciones tales como, por ejemplo, una operación de suma, una operación de resta, una operación de multiplicación, una operación de división, etc. Las operaciones aritméticas también pueden incluir, por ejemplo, operaciones aritméticas de enteros y/u operaciones aritméticas de coma flotante. Las operaciones lógicas pueden incluir operaciones, tales como, por ejemplo, una operación AND a nivel de bit, una operación OR a nivel de bit, una operación XOR a nivel de bit, etc. Las operaciones de comparación pueden incluir operaciones, tales como, por ejemplo, una operación mayor que, una operación menor que, una operación igual a cero, una operación no igual a cero, etc. Las operaciones mayor que y menor que pueden determinar si un primer elemento de datos es mayor o menor que un segundo elemento de datos. Las operaciones igual a cero y no igual a cero pueden determinar si un elemento de datos es igual a cero o no igual a cero. Los operandos usados para las operaciones se pueden almacenar en registros contenidos en el almacén de datos 78.
[0047] Cada uno de los elementos de procesamiento 74 se puede configurar para realizar una operación como respuesta a recibir una instrucción desde la unidad de control 72 por medio de la ruta de comunicación 82. En algunos ejemplos, cada uno de los elementos de procesamiento 74 se puede configurar para activarse y/o desactivarse independientemente de los otros elementos de procesamiento 74. En dichos ejemplos, cada uno de los elementos de procesamiento 74 se puede configurar para realizar una operación como respuesta a una recepción de una instrucción desde la unidad de control 72 cuando el elemento de procesamiento respectivo 74A-74D está activado, y no realizar la operación como respuesta a una recepción de la instrucción desde la unidad de control 72 cuando el elemento de procesamiento respectivo 74A-74D está desactivado, es decir, no activado.
[0048] Cada uno de los elementos de procesamiento 14A-14D puede estar comunicativamente acoplado al almacén de datos 78 por medio de una respectiva ruta de comunicación 86A-86D. Los elementos de procesamiento 74 se pueden configurar para recuperar datos del almacén de datos 78 y almacenar datos en el almacén de datos 78 por medio de las rutas de comunicación 86. Los datos recuperados del almacén de datos 18 pueden ser, en algunos ejemplos, operandos para las operaciones realizadas por los elementos de procesamiento 74. Los datos almacenados en el almacén de datos 78 pueden ser, en algunos ejemplos, el resultado de una operación realizada por los elementos de procesamiento 74.
[0049] El almacén de instrucciones 76 se configura para almacenar un programa para su ejecución mediante la GPU 12. El programa se puede almacenar como una secuencia de instrucciones. En algunos ejemplos, cada instrucción puede ser direccionada mediante un valor de dirección de instrucción único. En dichos ejemplos, los valores de dirección de instrucción para instrucciones posteriores en la secuencia de instrucciones son mayores que los valores de dirección de instrucción para instrucciones anteriores en la secuencia de instrucciones. Las instrucciones de programa, en algunos ejemplos, pueden ser instrucciones a nivel de máquina. Es decir, en dichos ejemplos, las instrucciones pueden estar en un formato que corresponde a la ISA de la GPU 12. El almacén de instrucciones 76 se configura para recibir una instrucción de lectura desde la unidad de control 72 por medio de la ruta de comunicación 80. La instrucción de lectura puede especificar una dirección de instrucción desde la cual se debería recuperar una instrucción. Como respuesta a una recepción de la instrucción de lectura, el almacén de instrucciones 76 puede proporcionar una instrucción correspondiente a la dirección de instrucción especificada en la instrucción de lectura a la unidad de control 72 por medio de la ruta de comunicación 80.
[0050] El almacén de instrucciones 76 puede ser cualquier tipo de memoria, memoria caché o combinación de las mismas. Cuando el almacén de instrucciones 76 es una memoria caché, el almacén de instrucciones 76 puede almacenar en memoria caché un programa que está almacenado en una memoria de programas externa a la GPU 12. Aunque el almacén de instrucciones 76 se ilustra dentro de la GPU 12, en otros ejemplos, el almacén de instrucciones 76 puede ser externo a la GPU 12.
[0051] El almacén de datos 78 se configura para almacenar elementos de datos usados por los elementos de procesamiento 74. En algunos ejemplos, el almacén de datos 78 puede comprender una pluralidad de registros, configurándose cada registro para almacenar un elemento de datos respectivo dentro de una pluralidad de elementos de datos usados en la GPU 12. El almacén de datos 78 puede estar acoplado a una o más rutas de comunicación (no mostradas) que se configuran para transferir datos entre los registros del almacén de datos 78 y una memoria o memoria caché (no mostradas).
[0052] Aunque la FIG. 2 ilustra un único almacén de datos 78 para almacenar datos usados por los elementos de procesamiento 74, en otros ejemplos, la GPU 12 puede incluir almacenes de datos separados y dedicados para cada uno de los elementos de procesamiento 74. La GPU 12 ilustra cuatro elementos de procesamiento 74 con propósitos ejemplares. En otros ejemplos, la GPU 12 puede tener muchos más elementos de procesamiento en la misma configuración o en una diferente.
[0053] La FIG. 3 es un diagrama de bloques que ilustra la unidad de control 72 en el ejemplo de GPU 12 de la FIG.
2 en mayor detalle. La unidad de control 72 incluye un contador de programa 88, un módulo de búsqueda 90, un módulo de descodificación 92 y un módulo de flujo de control 94. El módulo de flujo de control 94 se puede denominar de forma alternativa en el presente documento unidad de flujo de control.
[0054] El contador de programa 288 se configura para almacenar un valor de contador de programa. En algunos ejemplos, el contador de programa 88 puede ser un registro de hardware, tal como, por ejemplo, un registro de contador de programa. El valor del contador de programa puede ser indicativo de una instrucción almacenada en el almacén de instrucciones 76. El valor del contador de programa, en algunos casos, puede ser igual a la dirección de instrucción de la instrucción almacenada en el almacén de instrucciones 76. En casos adicionales, el valor del contador de programa se puede usar para calcular la dirección de instrucción de la instrucción almacenada en el almacén de instrucciones 76. Por ejemplo, el valor del contador de programa se puede añadir a un valor de desplazamiento para generar la dirección de instrucción. El contador de programa 88 se puede denominar en el presente documento "contador de programa global" o "registro de contador de programa global", porque el contador de programa 88 se puede usar como un único contador de programa para todos los elementos de procesamiento 74.
[0055] El módulo de búsqueda 90 se configura para buscar, por ejemplo, recuperar, una instrucción de la unidad de control 72 en base al valor del contador de programa almacenado en el contador de programa 88. Por ejemplo, el módulo de búsqueda 90 puede obtener una instrucción de una dirección de instrucción identificada mediante el valor del contador de programa almacenado en el contador de programa 88. El módulo de búsqueda 90 puede proporcionar la instrucción buscada para descodificar el módulo 92 para un procesamiento adicional.
[0056] El módulo de descodificación 92 se configura para descodificar la instrucción recibida desde el módulo de búsqueda 90. La descodificación de la instrucción puede implicar determinar si la instrucción es un tipo de instrucción que los elementos de procesamiento 74 pueden procesar. Si la instrucción es un tipo de instrucción que los elementos de procesamiento 74 pueden procesar, el módulo de descodificación 92 puede hacer que la instrucción se ejecute en uno o más de los elementos de procesamiento 74. En algunos ejemplos, el módulo de descodificación 92 puede hacer que la instrucción se ejecute en todos los elementos de procesamiento 74. En otros ejemplos, el módulo de descodificación 92 puede hacer que la instrucción se ejecute en menos que la totalidad de los elementos de procesamiento 74. Hacer que la instrucción se ejecute en uno o más de los elementos de procesamiento 74 puede incluir, en algunos casos, dar la instrucción a uno o más de los elementos de procesamiento 74 para su ejecución. Por ejemplo, el módulo de búsqueda 90 puede buscar una instrucción secuencial identificada mediante el contador de programa 88 y dar la instrucción secuencial a todos los elementos de procesamiento 74 que corresponden a hilos activos para su procesamiento. Si la instrucción no es el tipo de instrucción que los elementos de procesamiento 74 pueden procesar, la unidad de control 72 puede procesar la instrucción sin dar la instrucción a ninguno de los elementos de procesamiento 74 para su procesamiento. Por ejemplo, la instrucción puede ser una instrucción de flujo de control del tipo que no requiere procesamiento por los elementos de procesamiento 74, en cuyo caso la unidad de control 72 puede procesar la instrucción sin dar la instrucción a ninguno de los elementos de procesamiento 74.
[0057] En cualquier caso, el módulo de descodificación 92 puede reenviar información de control al módulo de flujo de control 94 para un procesamiento adicional. En algunos ejemplos, la información de control puede ser la propia instrucción. En otros ejemplos, la información de control puede incluir información, tal como, por ejemplo, información indicativa de si la instrucción es una instrucción de flujo de control o una instrucción secuencial; si la instrucción es una instrucción de flujo de control, información indicativa de si la instrucción es una instrucción de bifurcación o una instrucción de salto; si la instrucción es una instrucción de bifurcación o salto, información indicativa de si la instrucción de bifurcación o salto es una instrucción de bifurcación o salto avanzada o atrasada, y si la instrucción es una instrucción de bifurcación, información que especifica la condición de bifurcación.
[0058] Las instrucciones que son de un tipo que los elementos de procesamiento 74 pueden procesar pueden incluir instrucciones aritméticas e instrucciones lógicas. Una instrucción aritmética se puede referir a una instrucción que ordena a los elementos de procesamiento 74 que realicen una operación aritmética, y una instrucción lógica se puede referir a una instrucción que ordena a los elementos de procesamiento 74 que realicen una operación lógica. En algunos ejemplos, una instrucción de flujo de control puede ser una instrucción que los elementos de procesamiento 74 pueden procesar, por ejemplo, la instrucción de flujo de control puede incluir una condición de bifurcación que los elementos de procesamiento 74 evalúan. Las instrucciones que no son de un tipo que los elementos de procesamiento 74 pueden procesar pueden incluir instrucciones de flujo de control donde la unidad de control 72 evalúa la condición de bifurcación, y/o instrucciones de flujo de control que no tienen una condición de bifurcación.
[0059] El módulo de flujo de control 94 puede determinar un valor de contador de programa asociado con una siguiente instrucción que la unidad de control 72 va a procesar, y cargar el valor del contador de programa en el contador de programa 88. Si la instrucción buscada previamente es una instrucción secuencial, el módulo de flujo de control 94 puede seleccionar un valor de contador de programa que es indicativo de una siguiente instrucción secuencial almacenada en el almacén de instrucciones 76 para cargarlo en el contador de programa 88. Si la instrucción buscada previamente es una instrucción de flujo de control, el módulo de flujo de control 94 puede utilizar técnicas de contador de reanudación.
[0060] El módulo de flujo de control 94 puede almacenar un valor de contador de reanudación para cada hilo que se ejecuta en la GPU 12. Por ejemplo, el número de valores del contador de reanudación almacenados en el módulo de flujo de control 94 puede ser igual al número de elementos de procesamiento 74 contenidos en la GPU 12. Si para cada valor de contador de reanudación el hilo correspondiente al valor de contador de reanudación respectivo está inactivo, el valor del contador de reanudación puede ser indicativo de un valor del contador de programa en el que el hilo inactivo se debería activar o reactivar. De lo contrario, si el hilo correspondiente al valor de contador de reanudación respectivo está activo, el valor de contador de reanudación puede establecerse, en algunos ejemplos, en un valor máximo, es decir, un valor que es el valor más grande que se puede representar en la ranura o el registro de almacenamiento para el contador de reanudación.
[0061] El módulo de flujo de control 94 puede almacenar una marca activa para cada hilo que se ejecuta en la GPU 12. Por ejemplo, el número de marcas activas almacenadas en el módulo de flujo de control 94 puede ser igual al número de elementos de procesamiento 74 contenidos en la GPU 12. Cada marca activa puede indicar si el hilo asociado con la marca activa está activo o inactivo. En algunos ejemplos, la marca activa puede ser un solo bit que se establece para indicar que el hilo asociado con la marca activa está activo, y se restablece para indicar que el hilo asociado con la marca activa está inactivo.
[0062] En algunos ejemplos, el módulo de flujo de control 94 también puede almacenar un estado de programa. Por ejemplo, un primer estado de programa puede indicar que todos los hilos están activos, un segundo estado de programa puede indicar que al menos un hilo está activo y al menos un hilo está inactivo y un tercer estado de programa puede indicar que todos los hilos están inactivos. El estado de programa se puede usar, en dichos ejemplos, para seleccionar un valor de contador de programa para cargar en el contador de programa 88.
[0063] El módulo de flujo de control 94 se puede configurar, en algunos ejemplos, para activar y desactivar uno o más de los elementos de procesamiento 74 por medio de la ruta de comunicación 82. En ejemplos adicionales, el módulo de flujo de control 94 puede ordenar al módulo de descodificación 92 que active y desactive elementos de procesamiento 74 particulares. En otros ejemplos, el módulo de flujo de control 94 puede recibir los resultados de una instrucción de comparación desde uno o más de los elementos de procesamiento 74 por medio de la ruta de comunicación 82. Los resultados de la instrucción de comparación en algunos ejemplos se pueden usar para evaluar una condición de bifurcación. En otros ejemplos más, el módulo de flujo de control 94 puede recuperar uno o más elementos de datos del almacén de datos 78, por medio de la ruta de comunicación 84, con el propósito de evaluar una condición de bifurcación.
[0064] Como se analiza anteriormente, dentro de una máquina en paralelo (por ejemplo, un sistema de procesamiento SIMD), a menudo se plantea la necesidad de realizar operaciones divergentes, tales como una(s) operación(es) serializada(s). Por ejemplo, se puede ordenar a la GPU 12 que realice una "suma de prefijos", donde la entrada a un(os) hilo(s) dado(s) que se ejecuta(n) en los elementos de procesamiento 74 depende de la salida de otro hilo que se ejecuta en los elementos de procesamiento 74.
[0065] Un enfoque convencional para realizar operaciones serializadas en un sistema de procesamiento SIMD implica el uso de instrucciones nativas atómicas con las que todos los hilos competirían para realizar un bloqueo en una variable compartida (es decir, de modo que solo uno de los elementos de procesamiento 74 tenga acceso a la variable en un momento determinado). Sin embargo, el uso de instrucciones y bloqueos atómicos puede ser ineficaz, ya que son un recurso limitado y típicamente requieren una latencia prolongada para su ejecución.
[0066] Otro enfoque para realizar una operación en serie implica generar un valor exclusivo para cada hilo (por ejemplo, un ID de hilo). La GPU 12, a través de la unidad de control 72, se configuraría entonces para recorrer en bucle todos los hilos, seleccionando solo un hilo (mediante el ID de hilo) para cada iteración del bucle. A continuación, se muestra un ejemplo de seudocódigo para dicha operación:
For (i = 0; i) // i may represent the total number of threads in a wave
{if (thread_id == i) {perform serialized operation}}
[0067] El enfoque anterior requiere una comprobación y variables de prueba adicionales, así como la imposición de una iteración de bucle incluso para los hilos que pueden estar inactivos. Esto es ineficaz tanto desde el punto de vista de los recursos como del tiempo.
[0068] En vista de estos inconvenientes, esta divulgación propone unas técnicas para realizar operaciones serializadas en un sistema de procesamiento en paralelo (por ejemplo, un sistema de procesamiento SIMD). En los ejemplos siguientes, esta divulgación describe una instrucción (por ejemplo, una instrucción ejecutada por hardware) con la cual se puede seleccionar un hilo activo de una pluralidad de hilos para realizar una operación serializada, sin necesidad de acceder a ningún hilo inactivo.
[0069] La solución propuesta en esta descripción es una instrucción "GetOne" (GetOne_and_branch()) que la unidad de control 72 de la GPU 12 puede ejecutar. La unidad de control 72 se puede configurar para seleccionar un único hilo activo de una pluralidad de hilos (por ejemplo, los hilos de una onda) para su ejecución. La unidad de control 72 puede determinar qué hilos están activos actualmente usando la marca activa almacenada por el módulo de flujo de control 94. Una vez que se selecciona el hilo activo único, todos los demás hilos activos de la onda pueden ejecutar una condición de bifurcación, mientras que el hilo seleccionado realiza una operación divergente (por ejemplo, la operación en serie). La instrucción "GetOne" se puede usar a continuación para ejecutar una operación en serie como se muestra mediante el siguiente seudocódigo:
LOOP: GetOne_and branch_TRY_AGAIN
{perform serialized operation}
goto CONTINUE
TRY_AGAIN: goto LOOP
CONTINUE
[0070] En el ejemplo anterior, a la unidad de control 72 se le ordena inicialmente ir a la instrucción LOOP del código. La instrucción LOOP incluye la instrucción "GetOne" (GetOne_and_branch) que selecciona un único hilo activo de una pluralidad de hilos activos (por ejemplo, una onda) y pasa a la instrucción en serie ({perform serialized operation}) y a continuación sale del bloque de control (goto CONTINUE) y se inactiva. Los hilos no seleccionados realizan la instrucción de bifurcación de la instrucción GetOne_and_branch. En el ejemplo anterior, la instrucción de bifurcación es una instrucción "TRY_AGAIN", que esencialmente envía todos los hilos activos no seleccionados de regreso a la instrucción Loop. A continuación, se puede seleccionar otro de los hilos activos restantes para realizar la operación serializada.
[0071] El mecanismo de la instrucción "GetOne" permite una serialización eficaz dentro de una onda sin variables adicionales y sin requerir una iteración de bucle para hilos inactivos. Las técnicas de esta divulgación aprovechan el hecho de que los hilos paralelos dentro de una onda ya tienen algún nivel de sincronización debido a su única instrucción compartida. De esta manera, la instrucción "GetOne" de esta divulgación permite seleccionar un hilo activo para la operación en serie, mientras que simultáneamente desactiva todos los demás hilos activos.
[0072] La FIG. 4 es un diagrama de flujo que muestra las técnicas de operación serializada de esta divulgación en mayor detalle. Inicialmente, la unidad de control 72 de la GPU 12 puede recibir una instrucción "GetOne" (100). Como respuesta a la instrucción "GetOne", la unidad de control 72 se configura para determinar qué hilos de una pluralidad de hilos (por ejemplo, una onda) están activos (102). En un ejemplo, la unidad de control 72 se puede configurar para leer una marca activa asociada con cada uno de los hilos para determinar qué hilos están activos. Si la unidad de control 72 determina que no quedan hilos activos (103), el bloque de control termina (regresar 112).
[0073] Si la unidad de control 72 determina que quedan hilos activos (103), la unidad de control 72 puede seleccionar a continuación un hilo activo de la pluralidad de hilos (104). El hilo seleccionado (SÍ en 106) realiza a continuación la operación en serie (108) en uno de los elementos de procesamiento 74. Una vez realizada la operación en serie, el hilo activo seleccionado se desactiva (110). Los hilos activos restantes que no están seleccionados pueden realizar el bucle de regreso hasta la instrucción "Get One" (NO en 106).
[0074] La GPU 12, configurada para ejecutar la instrucción "GetOne" para la ejecución en serie descrita anteriormente, también se puede configurar para usar la instrucción "GetOne" para dividir una sola onda que presenta divergencia en múltiples subondas, cada uno de las cuales puede ser uniforme. Se va a suponer un ejemplo en el que es deseable realizar una llamada de subrutina (posiblemente divergente). Es decir, una situación donde solo una parte de los hilos de la onda van a realizar la subrutina. Una técnica convencional para ejecutar una subrutina divergente implica ejecutar cada hilo de forma única. Esto puede resultar ineficaz.
[0075] En cambio, la GPU 12 se puede configurar para ejecutar la instrucción "GetOne" para almacenar, en un registro compartido, una subrutina que, a continuación, todos los hilos que tienen acceso al registro compartido (es decir, elementos de procesamiento 74 que tienen acceso al registro compartido) pueden ejecutar. El registro compartido puede formar parte del almacén de datos 78, el almacén de instrucciones 76 u otra memoria disponible para los elementos de procesamiento 74.
[0076] Usando la instrucción "GetOne" y el registro compartido, la GPU 12 se puede configurar para seleccionar un objetivo de subrutina (es decir, una ubicación donde se almacenan las instrucciones de subrutina) usando la instrucción "GetOne", transmitir ese objetivo a todos los hilos (es decir, proporcionar un indicación de que una ubicación de subrutina está almacenada en un registro compartido) y ejecutar la subrutina en todos los hilos pertinentes (es decir, ejecutar la subrutina en los elementos de procesamiento 74 que tienen acceso al registro compartido). Este proceso se puede repetir a continuación para otros hilos que tienen acceso a diferentes registros compartidos. A continuación, se muestra un ejemplo de seudocódigo para este proceso.
LOOP: GetOne_and_branch CONTINUE 1
shared_R0 = subroutine_target//store target in a 'shared' register
CONTINUE1: if (subroutine_target == shared_R0)
{call(subroutine_target)
goto CONTINUE2
}
goto LOOP
CONTINUE2:
[0077] Inicialmente, la unidad de control 72 pasaría a la sección LOOP del código y ejecutaría la instrucción "GetOne" como se ha descrito previamente. La instrucción "GetOne" selecciona un hilo activo para realizar una operación. En el ejemplo anterior, un hilo activo seleccionado realizaría una operación que almacena la dirección de una ubicación (subroutine_target) en un registro compartido (shared_R0). Cualquier hilo activo que no se hubiera seleccionado realizaría la operación CONTINUE 1. En la operación CONTINUE 1, cada hilo (es decir, el elemento de procesamiento 74) que tiene acceso al registro compartido shared_R0 ejecuta el código localizado en subroutine_target y sale del bloque de control en CONTINUE 2. Si alguno de los hilos activos no seleccionados no tiene acceso al registro compartido, los hilos activos no seleccionados regresan a la operación de bucle, donde otra llamada de subrutina se puede almacenar en un registro compartido diferente. Nuevamente, como en el ejemplo de operación en serie, cualquier hilo inactivo se omite y se realiza el número mínimo de llamadas a subrutinas únicas.
[0078] La FIG. 5 es un diagrama de flujo que ilustra un ejemplo de procedimiento de la divulgación. Las técnicas de la FIG. 5 se pueden implementar mediante la GPU 12, que incluye la unidad de control 72 de GPU 12. En un ejemplo de la divulgación, la GPU 12 se configura para realizar un procedimiento de realización de operaciones divergentes en un procesador multihilo. La GPU 12 se puede configurar para determinar uno o más hilos activos de una pluralidad de hilos (152), seleccionar un hilo activo del uno o más hilos activos (154) y realizar una operación divergente en el hilo activo seleccionado (156).
[0079] En un ejemplo de la divulgación, el procesador multihilo es un procesador SIMD. En otro ejemplo de la divulgación, la pluralidad de hilos forman una onda, en el que el procesador SIMD ejecuta la onda en paralelo.
[0080] En otro ejemplo de la divulgación, la GPU 12 se configura para realizar la operación divergente en el hilo activo seleccionado realizando una operación serializada en el hilo activo seleccionado. En otro ejemplo de la divulgación, la operación divergente almacena un objetivo de subrutina en un registro compartido, y la GPU 12 se configura además para ejecutar un código almacenado en el objetivo de subrutina en el uno o más hilos activos que tienen acceso al registro compartido.
[0081] Las técnicas descritas en esta divulgación se pueden implementar, al menos en parte, en hardware, software, firmware o cualquier combinación de los mismos. Por ejemplo, diversos aspectos de las técnicas descritas se pueden implementar dentro de uno o más procesadores, incluyendo uno o más microprocesadores, procesadores de señales digitales (DSP), circuitos integrados específicos de la aplicación (ASIC), matrices de puertas programables in situ (FPGA), o en otros circuitos lógicos integrados o discretos equivalentes cualesquiera, así como en combinaciones cualesquiera de dichos componentes. El término "procesador" o "circuitos de procesamiento" se puede referir en general a cualquiera de los circuitos lógicos anteriores, solo o en combinación con otros circuitos lógicos, o a cualquier otro circuito equivalente, tal como hardware discreto que realiza un procesamiento.
[0082] Dicho hardware, software y firmware se pueden implementar dentro del mismo dispositivo o dentro de dispositivos separados para admitir las diversas operaciones y funciones descritas en esta divulgación. Además, cualquiera de las unidades, módulos o componentes descritos se pueden implementar juntos o por separado como dispositivos lógicos discretos pero interoperativos. La descripción de diferentes características como módulos o unidades pretende resaltar diferentes aspectos funcionales y no implica necesariamente que dichos módulos o unidades se deban realizar mediante componentes de software o hardware separados. Más bien, la funcionalidad asociada con uno o más módulos o unidades se puede realizar mediante hardware, firmware y/o componentes de software separados, o integrar dentro de componentes de software o hardware comunes o separados.
[0083] Las técnicas descritas en esta divulgación también se pueden almacenar, realizar o codificar en un medio legible por ordenador, tal como un medio de almacenamiento legible por ordenador que almacena instrucciones. Las instrucciones incluidas o codificadas en un medio legible por ordenador pueden hacer que uno o más procesadores realicen las técnicas descritas en el presente documento, por ejemplo, cuando las instrucciones se ejecutan mediante el uno o más procesadores. Los medios de almacenamiento legibles por ordenador pueden incluir memoria de acceso aleatorio (RAM), memoria de solo lectura (ROM), memoria de solo lectura programable (PROM), memoria de solo lectura programable y borrable (EPROM), memoria de solo lectura programable y borrable electrónicamente (EEPROM), memoria flash, un disco duro, un CD-ROM, un disco flexible, un casete, medios magnéticos, medios ópticos u otros medios de almacenamiento legibles por ordenador que sean tangibles.
[0084] Los medios legibles por ordenador pueden incluir medios de almacenamiento legibles por ordenador, que corresponden a un medio de almacenamiento tangible, tales como los medios indicados anteriormente. Los medios legibles por ordenador también pueden comprender medios de comunicación que incluyen cualquier medio que facilita la transferencia de un programa de ordenador de un lugar a otro, por ejemplo, de acuerdo con un protocolo de comunicación. De esta manera, la frase "medios legibles por ordenador" en general puede corresponder a (1) medios de almacenamiento tangibles legibles por ordenador que son no transitorios o (2) un medio de comunicación no tangible legible por ordenador tal como una señal transitoria o una onda portadora.
[0085] Se han descrito diversos aspectos y ejemplos. Sin embargo, se pueden realizar modificaciones a la estructura o las técnicas de esta divulgación sin apartarse del alcance de las siguientes reivindicaciones.

Claims (9)

REIVINDICACIONES
1. Un procedimiento operativo en un procesador de instrucción única, datos múltiples, SIMD, comprendiendo el procedimiento:
recibir una instrucción para realizar una operación divergente en el procesador SIMD; y
determinar (152), como respuesta a una recepción de la instrucción para realizar una operación divergente en el procesador SIMD, una pluralidad de hilos activos de una pluralidad de hilos del procesador SIMD; seleccionar (154) un único hilo activo de la pluralidad determinada de hilos activos; y
realizar (156) la operación divergente en el único hilo activo seleccionado mientras que todos los demás hilos activos ejecutan una condición de bifurcación.
2. El procedimiento de la reivindicación 1, en el que la pluralidad de hilos forman una onda, en el que la onda se ejecuta mediante el procesador SIMD en paralelo.
3. El procedimiento de la reivindicación 1, en el que realizar la operación divergente en el único hilo activo seleccionado comprende realizar una operación en serie en el único hilo activo seleccionado, en el que la salida de la operación en serie se necesita como entrada para uno o más de otros hilos que pueden no continuar procesando en paralelo hasta que la salida de la operación en serie se termina.
4. El procedimiento de la reivindicación 1, en el que realizar la operación divergente comprende almacenar un objetivo de subrutina en un registro compartido, comprendiendo además el procedimiento:
ejecutar un código almacenado en el objetivo de subrutina en el uno o más hilos activos que tienen acceso al registro compartido.
5. Un procesador de instrucción única, datos múltiples, SIMD, configurado para realizar operaciones divergentes, comprendiendo el procesador SIMD:
una unidad de control configurada para:
recibir una instrucción para realizar una operación divergente en el procesador SIMD,
determinar, como respuesta a una recepción de la instrucción para realizar una operación divergente, una pluralidad de hilos activos de una pluralidad de hilos del procesador SIMD, y
seleccionar un único hilo activo de la pluralidad determinada de hilos activos; y
una pluralidad de elementos de procesamiento, en el que un elemento de procesamiento de la pluralidad de elementos de procesamiento asociados con el único hilo activo seleccionado se configura para realizar la operación divergente mientras que los elementos de procesamiento asociados con todos los demás hilos activos ejecutan una condición de bifurcación.
6. El procesador SIMD de la reivindicación 5, en el que la pluralidad de hilos forman una onda, en el que la onda se ejecuta mediante el procesador SIMD en paralelo.
7. El procesador SIMD de la reivindicación 5, en el que el elemento de procesamiento asociado con el único hilo activo seleccionado se configura para realizar una operación en serie, en el que la salida de la operación en serie se necesita como entrada para uno o más de otros hilos que pueden no continuar procesando en paralelo hasta que la salida de la operación en serie se termina.
8. El procesador SIMD de la reivindicación 5, en el que la operación en serie almacena un objetivo de subrutina en un registro compartido, y en el que la pluralidad de elementos de procesamiento se configuran además para ejecutar un código almacenado en el objetivo de subrutina en cualquier elemento de procesamiento de la pluralidad de elementos de procesamiento que están asociados con el uno o más hilos activos y que tienen acceso al registro compartido.
9. Un dispositivo que comprende el procesador SIMD de cualquiera de las reivindicaciones 5 a 8, en el que el dispositivo es un reproductor de medios, un receptor de televisión, un teléfono inalámbrico, un asistente digital personal, un ordenador de escritorio, un ordenador portátil, una consola de juegos, una unidad de videoconferencia o un dispositivo informático de tableta.
ES15719929T 2014-05-02 2015-04-10 Técnicas de ejecución serializada en un sistema de procesamiento SIMD Active ES2834573T3 (es)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US14/268,215 US10133572B2 (en) 2014-05-02 2014-05-02 Techniques for serialized execution in a SIMD processing system
PCT/US2015/025362 WO2015167777A1 (en) 2014-05-02 2015-04-10 Techniques for serialized execution in a simd processing system

Publications (1)

Publication Number Publication Date
ES2834573T3 true ES2834573T3 (es) 2021-06-17

Family

ID=53039617

Family Applications (1)

Application Number Title Priority Date Filing Date
ES15719929T Active ES2834573T3 (es) 2014-05-02 2015-04-10 Técnicas de ejecución serializada en un sistema de procesamiento SIMD

Country Status (8)

Country Link
US (1) US10133572B2 (es)
EP (1) EP3137988B1 (es)
JP (1) JP2017515228A (es)
KR (1) KR20160148673A (es)
CN (1) CN106233248B (es)
BR (1) BR112016025511A2 (es)
ES (1) ES2834573T3 (es)
WO (1) WO2015167777A1 (es)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9898348B2 (en) * 2014-10-22 2018-02-20 International Business Machines Corporation Resource mapping in multi-threaded central processor units
US9921838B2 (en) * 2015-10-02 2018-03-20 Mediatek Inc. System and method for managing static divergence in a SIMD computing architecture
JP6420489B2 (ja) * 2016-04-19 2018-11-07 華為技術有限公司Huawei Technologies Co.,Ltd. セグメント化ハッシュ値計算のためのベクトル処理
US10034407B2 (en) * 2016-07-22 2018-07-24 Intel Corporation Storage sled for a data center
US10565017B2 (en) * 2016-09-23 2020-02-18 Samsung Electronics Co., Ltd. Multi-thread processor and controlling method thereof
US10990409B2 (en) * 2017-04-21 2021-04-27 Intel Corporation Control flow mechanism for execution of graphics processor instructions using active channel packing
CN108549583B (zh) * 2018-04-17 2021-05-07 致云科技有限公司 大数据处理方法、装置、服务器及可读存储介质
WO2020076630A1 (en) * 2018-10-08 2020-04-16 Convida Wireless, Llc Device discovery and connectivity in a cellular network
US12314760B2 (en) * 2021-09-27 2025-05-27 Advanced Micro Devices, Inc. Garbage collecting wavefront

Family Cites Families (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6947047B1 (en) 2001-09-20 2005-09-20 Nvidia Corporation Method and system for programmable pipelined graphics processing with branching instructions
US7895328B2 (en) 2002-12-13 2011-02-22 International Business Machines Corporation System and method for context-based serialization of messages in a parallel execution environment
US7657882B2 (en) 2004-01-22 2010-02-02 University Of Washington Wavescalar architecture having a wave order memory
US7590830B2 (en) * 2004-05-28 2009-09-15 Sun Microsystems, Inc. Method and structure for concurrent branch prediction in a processor
GB2437836B (en) 2005-02-25 2009-01-14 Clearspeed Technology Plc Microprocessor architectures
US7761697B1 (en) * 2005-07-13 2010-07-20 Nvidia Corporation Processing an indirect branch instruction in a SIMD architecture
US7634637B1 (en) 2005-12-16 2009-12-15 Nvidia Corporation Execution of parallel groups of threads with per-instruction serialization
US8176265B2 (en) 2006-10-30 2012-05-08 Nvidia Corporation Shared single-access memory with management of multiple parallel requests
US8312254B2 (en) * 2008-03-24 2012-11-13 Nvidia Corporation Indirect function call instructions in a synchronous parallel thread processor
US8850436B2 (en) 2009-09-28 2014-09-30 Nvidia Corporation Opcode-specified predicatable warp post-synchronization
US8782645B2 (en) * 2011-05-11 2014-07-15 Advanced Micro Devices, Inc. Automatic load balancing for heterogeneous cores
US8683468B2 (en) * 2011-05-16 2014-03-25 Advanced Micro Devices, Inc. Automatic kernel migration for heterogeneous cores
US10152329B2 (en) 2012-02-09 2018-12-11 Nvidia Corporation Pre-scheduled replays of divergent operations
US9256429B2 (en) 2012-08-08 2016-02-09 Qualcomm Incorporated Selectively activating a resume check operation in a multi-threaded processing system
US10013290B2 (en) 2012-09-10 2018-07-03 Nvidia Corporation System and method for synchronizing threads in a divergent region of code
US9229721B2 (en) * 2012-09-10 2016-01-05 Qualcomm Incorporated Executing subroutines in a multi-threaded processing system
KR101603752B1 (ko) * 2013-01-28 2016-03-28 삼성전자주식회사 멀티 모드 지원 프로세서 및 그 프로세서에서 멀티 모드를 지원하는 방법
KR20150019349A (ko) * 2013-08-13 2015-02-25 삼성전자주식회사 다중 쓰레드 실행 프로세서 및 이의 동작 방법
US9652284B2 (en) * 2013-10-01 2017-05-16 Qualcomm Incorporated GPU divergence barrier

Also Published As

Publication number Publication date
US10133572B2 (en) 2018-11-20
KR20160148673A (ko) 2016-12-26
CN106233248B (zh) 2018-11-13
JP2017515228A (ja) 2017-06-08
EP3137988A1 (en) 2017-03-08
US20150317157A1 (en) 2015-11-05
BR112016025511A2 (pt) 2017-08-15
WO2015167777A1 (en) 2015-11-05
EP3137988B1 (en) 2020-09-02
CN106233248A (zh) 2016-12-14

Similar Documents

Publication Publication Date Title
ES2834573T3 (es) Técnicas de ejecución serializada en un sistema de procesamiento SIMD
JP7087029B2 (ja) 中央処理装置(cpu)と補助プロセッサとの間の改善した関数コールバック機構
ES2879806T3 (es) Cambio de contexto virtual acelerado por hardware
ES2777827T3 (es) Predicados uniformes en sombreadores para unidades de procesamiento de gráficos
CN104603749B (zh) 用于在单指令多数据simd处理系统中控制发散分支指令的方法和设备
US11900122B2 (en) Methods and systems for inter-pipeline data hazard avoidance
US8615646B2 (en) Unanimous branch instructions in a parallel thread processor
US8832417B2 (en) Program flow control for multiple divergent SIMD threads using a minimum resume counter
Weston et al. Getting Started with doParallel and foreach
US8572355B2 (en) Support for non-local returns in parallel thread SIMD engine
US10067710B2 (en) Detecting buffer overflows in general-purpose GPU applications
CN103970511A (zh) 能够支持多模式的处理器及其多模式支持方法
KR102152735B1 (ko) 그래픽 처리 장치 및 이의 동작 방법
Weston Getting Started with doMC and foreach
US11188333B2 (en) Display device and control method thereof
US8516231B2 (en) Interrupt handling apparatus and method for equal-model processor and processor including the interrupt handling apparatus
US20210096877A1 (en) Collapsing bubbles in a processing unit pipeline
BR112018016913B1 (pt) Método e aparelho para processamento de dados e memória legível por computador