pycuda 예제

By 2019. augusztus 2. Egyéb kategória No Comments

개체의 수명에 연결된 개체 정리입니다. C++에서 RAII라고도 하는 이 관용구를 사용하면 올바른 코드, 누수 및 충돌이 없는 코드를 훨씬 쉽게 작성할 수 있습니다. PyCUDA는 종속성에 대해서도 알고 있으므로(예: 종속된 모든 메모리가 해제되기 전에) 컨텍스트에서 분리되지 않습니다. 기본 사항에 대해 충분히 익숙해지면 장치 인터페이스를 자유롭게 파헤쳐보십시오. 자세한 예제를 보려면 배포의 예제/하위 디렉터리에서 를 확인합니다. 이 폴더에는 GPU와 CPU 기반 계산의 차이를 확인하기 위한 몇 가지 벤치마크도 포함되어 있습니다. 작업이 수행되는 방법에 대한 참조로, 배포의 테스트 / 하위 디렉토리에서 PyCuda의 테스트 도구 모음도 도움이 될 수 있습니다. 공유 할 수있는 좋은 자체 포함 예제가있는 경우 여기에 페이지 이름을 입력하고 공유를 시작하십시오 : (니콜라스 퉁에 의해 기여, 예제 / demo_struct.py에서 코드를 찾으십시오) 이러한 예제를 재생하려면 download-examples-from-wiki.py 실행하십시오. 예제 디렉토리. (v0.94 이상 또는 현재 git) pycuda.driver.In, pycuda.driver.Out 및 pycuda.driver.InOut 인수 처리기는 일부 메모리 전송을 단순화할 수 있습니다. 예를 들어 a_gpu를 만드는 대신 a를 교체하는 것이 괜찮은 경우 다음 코드를 사용할 수 있습니다. 예제에서 정리 코드가 없는 방법을 확인하십시오.

우리가 게으르고 그냥 건너 뛰었기 때문이 아닙니다. 그것은 단순히 필요하지 않습니다. PyCUDA는 자동으로 필요한 정리를 유추하고 당신을 위해 그것을 할 것입니다. PyCUDA의 numpy 상호 작용 코드는 자동으로 장치에 공간을 할당하고, numpy 배열a와 b 를 복사하고, 400x1x1 단일 블록 그리드를 시작하고, 다시 dest를 복사했습니다. pycuda.gpuarray.GPUArray를 사용하면 훨씬 적은 쓰기로 동일한 효과를 얻을 수 있습니다: 마지막으로 데이터를 전송할 어딘가가 필요하므로 장치에 메모리를 할당해야 합니다: 이 코드는 pycuda.driver.to_device() 및 pycuda.driver.from_device()를 사용합니다. 값을 할당하고 복사하는 함수와 할당된 메모리 블록에 대한 오프셋을 사용할 수 있는 방법을 보여 줍니다. 마지막으로 코드를 실행할 수 있습니다. 다음은 두 배열을 두 배로 한 다음 두 번째 배열만 보여 줍니다.

무대 뒤에서 훨씬 더 흥미로운 것들이 진행중입니다: PyCuda를 사용하기 전에, PyCuda를 사용하기 전에, 당신은 그것을 가져오고 초기화해야합니다 : 우리는 변수 길이 배열의 수를 두 배로 하기 위해 다음과 같은 구조를 가지고 있다고 가정하십시오 : 오류가 없는 경우 코드가 컴파일되고 장치에 로드됩니다. pycuda.function에 대한 참조를 찾아 a_gpu를 인수로 지정하고 4×4 의 블록 크기를 지정합니다: PyCUDA는 CUDA 소스 코드를 컴파일하여 카드에 업로드했습니다. 대부분의 프로그램의 다음 단계는 장치로 데이터를 전송하는 것입니다. PyCuda에서는 주로 호스트의 numpy 배열에서 데이터를 전송합니다. (그러나 실제로, 파이썬 버퍼 인터페이스를 만지는 모든 것이 작동합니다. 4×4 난수 배열을 만들어 보겠습니다: 마지막으로 GPU에서 데이터를 다시 가져와서 원래 a와 함께 표시합니다: 그리드의 각 블록(CUDA 설명서 참조)은 배열 중 하나를 두 배로 만듭니다. for 루프를 사용하면 스레드보다 더 많은 데이터 요소를 두 배로 만들 수 있지만 충분한 수의 스레드가 있음을 보장할 수 있는 경우 효율적이지 않습니다. 다음으로, 구조에 대 한 래퍼 클래스가 만들어집니다., 그리고 두 개의 배열인스턴스화: 하지만 wait-a 이중 정밀도 숫자로 구성, 하지만 대부분의 nVidia 장치는 단일 정밀도 지원: pycuda.autoinit- 초기화, 컨텍스트를 사용할 필요가 없습니다. 원하는 경우 수동으로 정리를 수행할 수도 있습니다.