2017-05-12 5 views
0

, 하나는 CUDA/OpenCL을 커널에 일부 similarites를 볼 수 있습니다 - 예를 들면 : 당신이 필요로하는python의 멀티 스레딩 응용 프로그램은 opencl/cuda와 매우 비슷해 보입니다. 응용 프로그램을 GPU 멀티 스레딩으로 이식 할 수 있습니까? 하나는 병렬 벡터를 추가하는 함수 <code>kernel</code>가 정의 다음과 같은 멀티 스레딩 코드를 살펴 취하면

  1. 스레드 ID/커널 - 벡터를 해결하기위한 ID
  2. 당신이 가져 오기를 스레딩에서 손

전에 출력의 메모리를 할당 할 필요가

  • 제공되는 메모리에 기록 이후에는 반환 값이 없다
  • 스레드

    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) 
    

    내 질문은 GPU로 코드의 병렬 처리를 내보내는 쉬운 방법이 있다면 내 질문입니다. 물론 CUDA/OpenCL을 작성하는 것이 아니라이 문제에 대해 기존 도구를 사용하거나 가능한 경우 그러한 도구를 만드는 것입니다.

    물론 고급 응용 프로그램에서는 작동하지 않을 수 있습니다. 저는 PyCuda에 대해 알고 있습니다.하지만이 경우 응용 프로그램을 다시 작성하게 될 것입니다.

  • 답변

    1

    보기 쉽지 않습니다. GPU 프로그래밍은 CPU와 매우 다르며, GPU에서 할 수없는 많은 것들을 파이썬에서 할 수 있습니다. 가장 복잡한 것은 파이썬이 많은 역동적 메모리 할당과 함수 포인터를 필요로하는 해석 언어라는 사실입니다. 이것은 GPU 장치에서 지원되지 않습니다. 즉, 단순히 GPU에서 실행되는 파이썬의 인터프리터를 단순히 만들 수는 없습니다. 또 다른 문제는 GPU에 개별 스레드를 만들 수 없다는 것입니다. GPU (커널)에 제출 된 각 함수는 여러 스레드를 함께 시작합니다. 즉, 각 반복마다 개별 스레드를 생성하므로 해당 코드에서 사용하는 기존 루프가 작동하지 않습니다 (적어도 효율적이지는 않음). 이것은 파이썬에서만 문제가되는 것이 아니라 거의 모든 프로그래밍 언어에서 일반적으로 일부 가속기를 사용하면 실행 모델의 차이점에 맞게 코드를 변경해야합니다. offering high level interfaces to interpreted languages을 조사한 연구가 있지만 아직 생산 단계에서 멀다.