2012-12-13 3 views
1

C로 작성된 더 작은 프로그램을 openCL로 번역하려고합니다. 일부 입력 데이터를 GPU로 전송 한 다음 연속적인 커널 호출을 사용하여 장치에서 모든 계산을 수행하기로되어 있습니다.C 코드를 OpenCL로 변환

그러나 데이터 양이 많아서 CPU와 GPU간에 데이터를주고받는 것을 피해야하기 때문에 병렬 처리에 적합하지 않은 코드 부분에 어려움을 겪고 있습니다.

커널의 일부를 병렬 처리하지 않고 실행할 수있는 방법이 있습니까?이 코드를이 코드로 대체 할 수 있습니까? 글로벌 작업 규모를 1로 설정하면됩니까?

답변

1

예, OpenCL 장치에서 코드를 순차적으로 실행할 수 있습니다. 이렇게하려면 C에서와 같은 방식으로 커널 코드를 작성한 다음 clEnqueueTask() 기능으로 실행하십시오.

0

당신은이 장치 관리 할 수 ​​: 이것은 당신이해야하기 때문에 약간 복잡

순차적 코드에 대한 고도의 병렬화 코드

  • CPU에 대한

    • GPU을 하나의 장치를 명령 대기열으로 관리하여 각 커널을 적절한 시간에 예약하십시오 우수 장치.

      장치가 같은 상황를 사용할 수있는 동일한 플랫폼 (일반적으로 AMD)의 일부인 경우

      , 그렇지 않으면 당신은 CPU에 대한 또 하나의 컨텍스트를 만들어야합니다.

      또한, 당신은 당신의 CPU가 지원하는 경우는 장치 분열를 사용할 수 더 세밀한 CPU 작업 병렬화를 갖고 싶어합니다.

  • +0

    답변 해 주셔서 감사합니다. 나는 openCL에 익숙하다. 어리석은 질문이라면 용서해 주겠다.하지만 두 개의 맥락 (Intel CPU와 nVidia GPU)을 가지고 있다면 데이터를 앞뒤로 보내야한다는 뜻은 아니다. – user1894442

    +0

    메모리 매핑과 함께 고정 메모리를 사용할 수 있습니다 : CPU는 메모리에 직접 액세스 할 수 있으며 GPU는 필요한 부분을 전역 메모리에 복사 할 수 있습니다. 처리에 비해 많은 데이터 이동이있는 경우 알고리즘을 수정해야 할 수 있습니다. 이상적인 경우 CPU와 GPU를 동시에 실행할 수 있습니다. – Pragmateek