2017-12-27 28 views
0

OpenCL을 사용하여 현재 GPU 메모리 사용을 확인할 수있는 확실한 방법을 찾고 있습니다.OpenCL에서 GPU 메모리 사용법을 얻으려면 어떻게해야합니까?

NVidia API : cudaMemGetInfo(size_t* free, size_t* total)을 (를) 사용하여 현재 장치의 사용 가능한 메모리와 전체 메모리를 확보했습니다.

하지만 AMD와 OpenCL에 대한 해결책을 찾고 있습니다. OpenCL에 비슷한 기능이 있는지 찾아 내지 못했고 AMD에 비슷한 기능이 있는지 모르겠습니다.

버퍼를 할당하기 전에 OpenCL 장치에 얼마나 많은 여유 메모리가 있는지 알고 싶지 않지만 버퍼를 할당 할 수있는 여유 메모리가 있습니다. How do I determine available device memory in OpenCL?에 표시된 바와 같이 선험적으로 OpenCL을 사용하면 방법이 없으므로이를 알 필요가 없습니다.

+0

[OpenCL에서 사용 가능한 장치 메모리를 어떻게 결정합니까?] (https://stackoverflow.com/questions/3568115/how-do-i-determine-available-device-memory-in-opencl) – ivaigult

답변

3

버퍼를 할당하기 전의 디바이스지만 버퍼를 할당 할 수있는 메모리. 하지만, 아마 단지 전용 드라이버와 함께 작동이 확장 -

는 AMD의 경우, 아마도 cl_amd_device_attribute_query extension에서 CL_DEVICE_GLOBAL_FREE_MEMORY_AMD을 시도합니다.

일반적으로 AFAIK는 (기기에서) 개의 버퍼가 할당 된 경우 을 알 수있는 방법이 없으므로 불가능합니다. 이러한 의미에서 OpenCL은 CUDA보다 높은 수준입니다. 버퍼는 컨텍스트에 속하며 장치에는 속하지 않습니다. clCreateBuffer()를 호출하면 모든 장치에 메모리를 할당 할 수는 있지만 그렇게 할 필요는 없습니다. 구현은 버퍼를 필요로하는 커널을 실행하기 전에 버퍼를 디바이스 메모리로 자동으로 마이그레이션하고, 다음 커널을 위해 메모리를 비워야하는 경우 디바이스에서 멀리 옮깁니다. 장치의 여유 메모리를 확보하더라도 clEnqueueNDRange()가 반드시 커널을 즉시 시작하지는 않기 때문에 커널을 실행할 것인지 결정하는 데 100 % 안정적으로 사용할 수는 없습니다 (단지 큐에 넣기 만하면됩니다. 큐에있는 다른 것, 지연 될 수 있음), 같은 컴퓨터에있는 다른 응용 프로그램은 그동안 GPU에서 예약 될 수 있습니다.

메모리 스왑을 피하려면 1) 응용 프로그램이 GPU를 사용하는 유일한 응용 프로그램인지, 2) 각 커널에 대해 총 버퍼 인수 크기가 < = GLOBAL_MEM_SIZE인지 확인해야합니다.