2017-05-12 1 views
0

Si l'on jette un regard sur le code multithread suivant, où une fonction kernel est définie, qui ajoutera un vecteur en parallèle, on peut voir quelques similarités à noyau CUDA/OpenCL - tels que:Puisque les applications multithread en python sont très similaires à opencl/cuda - est-il possible de porter l'application vers le multithreading GPU?

  1. Vous avez besoin un identifiant de fil/kernel - id pour aborder le vecteur
  2. Il n'y a pas de valeur de retour, puisque vous écrivez à la mémoire fournie
  3. vous devez allouer la mémoire de la sortie avant la main

de filetage importation Discussion

def kernel(i,A,B,C): 
    """ 
     Does a vector addition 

     @param A output vector 
     @param B input vector 
     @param C input vector 
    """ 

    A[i] = B[i] + C[i] 



vec_length = 1000 

#Allocate memory 
A = [None] * vec_length 
B = [1] * vec_length 
C = [2] * vec_length 

processes = [] 
for i in range(0,vec_length): 
    processes.append(Thread(target=kernel,args=[i,A,B,C])) 
    processes[i].start() 
for i in range(0,vec_length): 
    processes[i].join() 

print(A) 

Ma question est, s'il existe un moyen facile d'exporter le parallélisme du code pour GPU. Bien sûr, pas en écrivant CUDA/OpenCL - mais en utilisant un outil existant pour ce problème ou en créant un tel outil si c'est possible.

Bien sûr, cela peut ne pas fonctionner pour les applications avancées. Je suis au courant de PyCuda - cependant cela entraînera la réécriture de l'application.

Répondre

1

Ce n'est pas aussi simple que ça en a l'air. La programmation GPU est très différente de CPU, et vous pouvez faire beaucoup de choses en Python que vous ne pouvez pas faire sur un GPU. Le plus compliqué est le fait que python est un langage interprété, qui nécessite beaucoup d'allocation de mémoire dynamique et de pointeurs de fonction. Ceci n'est pas supporté sur les GPU, ce qui signifie que vous ne pouvez pas simplement créer un interpréteur de python qui s'exécute sur le GPU. Un autre problème est que vous ne pouvez pas créer de threads individuels sur le GPU, chaque fonction soumise à un GPU (un noyau) démarre un tas de threads ensemble. Cela signifie que les boucles traditionnelles que vous avez dans ce code ne fonctionneront pas (du moins pas efficacement), puisque vous générez des threads individuels à chaque itération. Ce n'est pas un problème uniquement pour Python, mais pour presque tous les langages de programmation, et en général l'utilisation d'un accélérateur nécessite toujours des changements de code pour correspondre aux différences dans le modèle d'exécution. Il y a quelques travaux de recherche regardant offering high level interfaces to interpreted languages, mais est encore loin d'une étape de production.