OpenCL 작업

OpenCL프로그램은 OpenCL 1.1이상을 지원하는 비디오 카드에 계산을 수행하기 위해 사용됩니다. 최신 비디오 카드에는 수신 데이터 스트림과 함께 간단한 수학적 연산을 동시에 수행할 수 있는 수백 개의 소형 전문 프로세서가 포함되어 있습니다. OpenCL 언어는 병렬 컴퓨팅을 구성하고 특정 종류의 작업에 더 빠른 속도를 제공합니다.

일부 그래픽 카드에서는 기본적으로 double 유형 번호로 작업할 수 있습니다. 이로 인해 컴파일 오류 5105가 발생할 수 있습니다. double 유형 번호에 대한 지원을 활성화하려면 OpenCL 프로그램에 #pragma OPENCL EXTENSION cl_khr_fp64 : enable 명령을 추가하십시오. 그러나 그래픽 카드가 double을 지원하지 않는 경우 이 명령문을 활성화하는 것은 도움이 되지 않습니다.

OpenCL에 대한 소스 코드를 별도의 CL 파일에 쓰는 것이 좋습니다. 이 소스 코드는 나중에 리소스 변수를 사용하여 MQL5 프로그램에 포함될 수 있습니다.

OpenCL프로그램에서 핸들링 에러

OpenCL 프로그램에서 발생한 마지막 오류에 대한 정보를 얻으려면CLGetInfoIntegerCLGetInfoString함수를 사용하십시오. 이 함수들은 오류 코드와 설명을 가져옵니다.

OpenCL 마지막 에러 코드: 최근에 발생한 OpenCL 에러를 알아보기 위해서는 CLGetInfoInteger를 호출하십시오, 호출은 handle 매개변수가 무시되는 동안 이루어져야 합니다 (0으로 설정 가능). 에러 설명:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.

알 수 없는 오류 코드의 경우 "알 수 없는 OpenCL 오류 N"이란 문자열이 반환되며 여기서 N은 오류 코드입니다. 예:

//--- 첫 번째 'handle' 매개변수는 마지막 오류를 가져올 때 무시됩니다.code
intcode= (int)CLGetInfoInteger(0,CL_LAST_ERROR);

OpenCL 오류에 대한 텍스트 설명: 최근의 OpenCL 에러를 가져오려면 CLGetInfoString을 호출하세요. 에러 코드는 반드시 핸들매개변수로 전달되어야 합니다.

에러 설명:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. 에러 코드 대신 CL_LAST_ERROR가 전달되면 함수는 마지막 에러에 대한 설명을 반환합니다. 예시:

//--- 마지막 OpenCL 에러 코드 가져오기
int   code= (int)CLGetInfoInteger(0,CL_LAST_ERROR);
stringdesc;// 에러 설명 
 
//--- 에러에 대한 설명을 얻으려면 에러 코드를 사용하세요 
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
 desc="OpenCL 에러 설명을 얻을 수 없음"+ (string)GetLastError();
Print(desc);
 
//--- 코드를 먼저 가져오지 않으면서 마지막 OpenCL 에러에 대한 설명을 가져오려면 CL_LAST_ERROR를 전달하세요.  
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION,desc))
 desc="OpenCL 에러 설명을 얻을 수 없음"+ (string)GetLastError();
Print(desc);;

 

지금까지는 내부 열거형의 이름이 에러에 대한 설명으로 제공되었습니다. 여기에서 디코딩을 찾을 수 있습니다:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. 예를 들어 CL_INVALID_KERNEL_ARGS 값은 "일부 커널 인수가 설정되지 않았거나 유효하지 않은 경우 커널을 큐에 더할 때 반환됨"을 의미합니다.

OpenCL에서 프로그램을 실행하는 함수:

함수

기능

CLHandleType

ENUM_OPENCL_HANDLE_TYPE 열거값으로 OpenCL 핸들 유형을 반환합니다

CLGetInfoInteger

OpenCL 개체 또는 디바이스에 대한 정수 속성 값을 반환합니다

CLContextCreate

OpenCL 컨텍스트를 생성합니다

CLContextFree

OpenCL 컨텍스트를 제거합니다

CLGetDeviceInfo

OpenCL 드라이버로부터 장치 속성 수신

CLProgramCreate

소스 코드에서 OpenCL 프로그램을 생성합니다

CLProgramFree

OpenCL 프로그램을 제거합니다

CLKernelCreate

OpenCL 시작 함수를 생성합니다

CLKernelFree

OpenCL 시작 기능을 제거합니다

CLSetKernelArg

OpenCL 함수에 대한 매개 변수를 설정합니다

CLSetKernelArgMem

OpenCL 버퍼를 OpenCL 함수의 매개 변수로 설정합니다

CLSetKernelArgMemLocal

로컬 버퍼를 커널 함수의 인수로 설정합니다

CLBufferCreate

OpenCL 버퍼를 생성합니다

CLBufferFree

OpenCL 버퍼를 삭제합니다

CLBufferWrite

OpenCL 버퍼에 배열을 씁니다

CLBufferRead

OpenCL 버퍼를 배열로 읽습니다

CLExecute

OpenCL 프로그램을 실행합니다

CLExecutionStatus

OpenCL 프로그램 실행 상태를 반환합니다

참고 항목

OpenCL, Resources