TornadoVM: apporter aux applications Java l'accélération des GPU et des FPGA

Par:
admin

mer, 17/06/2020 - 15:37

TornadoVM est un plug-in pour OpenJDK et GraalVM qui permet aux programmeurs d'exécuter automatiquement des programmes Java sur du matériel hétérogène. TornadoVM cible actuellement les appareils compatibles OpenCL et fonctionne sur des processeurs multicœurs, des GPU (NVIDIA et AMD), des GPU intégrés Intel et des FPGA (Intel et Xilinx).

Les applications écrites pour TornadoVM sont à source unique - le même code est utilisé pour exprimer le code hôte et le code accéléré. TornadoVM étend le compilateur Graal JIT avec un nouveau backend pour OpenCL. A l'exécution, TornadoVM décharge les application Java sur les CPU multicoeurs, les GPU et les FPGA.

Soit une multiplication matricielle codée en Java :

class Compute {
   public static void matrixMultiplication(final float[] A, final float[] B, final float[] C, final int size) {
          for (int i = 0; i < size; i++) {
          for (int j = 0; j < size; j++) {
                    float sum = 0.0f;
                    for (int k = 0; k < size; k++) 
                   sum += A[(i * size) + k] * B[(k * size) + j];
                C[(i * size) + j] = sum;
          }
            }
    }
}

Pour accélérer ce code avec TornadoVM, on annote les boucles qui peuvent être parallélisées, comme ceci :

class Compute {
   public static void matrixMultiplication(final float[] A, final float[] B, final float[] C, final int size) {
          for (@Parallel int i = 0; i < size; i++) {
          for (@Parallel int j = 0; j < size; j++) {
                    float sum = 0.0f;
                    for (int k = 0; k < size; k++) 
                   sum += A[(i * size) + k] * B[(k * size) + j];
                C[(i * size) + j] = sum;
           }
         }
    }
}

Le compilateur TornadoVM JIT ne force pas la parallélisation. Au lieu de cela, il vérifie si les boucles annotées peuvent être parallélisées et il remplace les boucles for pour l'indexation parallèle équivalente dans OpenCL. Si les boucles for ne peuvent pas être parallélisées, TornadoVM sort et exécute le code séquentiel.

L'illustration ci-dessous montre une représentation du flux d'exécution entre JVM et TornadoVM.

TornadoVM  est un logiciel libre sous licence Apache 2.0, disponible sur GiHub.

Le créateur de TornadoVM a présenté celui en mars dernier lors de la conférence QCon-London. Les visuels et les démonstrations utilisés pour cette conférrence sont également disponible sur GitHub.

Le créateur de TornadoVM a également publié sur InfoQ un article très détaillé sur la mise en oeuvre de TornadoVM.