C++에서 OpenCL(환경 구축 편)

14743 단어 OpenCLC++

목적지


OpenCL 같은 것은 다른 사이트에 양보하고 사용하세요.즐거우니까.

프로그램 전문


github 클론이 가능합니다.

환경 구조


이 문장이 창조한 환경


Visual Studio는 좀 낡았지만 구축 설정은 크게 다르지 않다고 생각합니다.
・Windows 10
・Visual Studio 2015
・Intel SDK for OpenCL7.0.0.2519

OpenCL SDK 확보


OpenCLKhronos Group은 사양을 지정하고 공급업체별로 사양에 따라 구현합니다.따라서 모든 기계의 공급업체로부터 OpenCL의 SDK를 받아야 한다.
Intel제 CPU/GPU의 경우 Intel® SDK for OpenCL™ Applications에서 Intel용 OpenCL SDK를 받을 수 있습니다.SDK를 입수하려면 메일 주소를 입력하고 개발 업체에 로그인해야 하기 때문에 좀 번거로울 수 있습니다.
설치는 설치 프로그램이 말한 대로 진행되기 때문에 좋아하지 않는다.

구성 설정(Visual Studio)


설치가 완료되면 Visual Studio를 시작하고 새 프로젝트를 먼저 시작하십시오.어려울 때 win32 컨트롤러 프로그램을 선택하십시오. 귀찮아서 빈 프로젝트를 만듭니다.
프로젝트를 작성한 후 OpenCL을 사용하도록 구성 설정을 수정할 수 있습니다.
먼저 [VC++ 디렉터리]의 [디렉터리 포함]에서include 폴더를 지정합니다.아무 생각 없이 Intel SDK에 뛰어들었다면 C:\Intel\OpenCL\sdk\include입니다.
이 때 include의 CL 폴더를 통과하지 않도록 주의하십시오.CL을 통과하면 중요한 걸 많이 못 찾겠어요.

이어서 [링컨]→[일반]의 [추가 라이브러리 디렉터리]에서lib 폴더를 지정합니다.lib 폴더에는 x64와 x86을 위한 폴더가 있습니다. 경로를 통해 필요한 사람에게 주십시오.이번에는 C:\Intel\OpenCL\sdk\lib\x86을 통과했습니다.

마지막으로 OpenCL은 링크→가져오기의 첨부 종속 파일에서 사용됩니다.lib을 지정합니다.


플랫폼 및 장치 확인


Congratulations!이렇게 하면 즐거운 OpenCL 생활을 누릴 수 있습니다!!아니, 아직!!
실제로 OpenCL을 사용할 때는 색인을 사용하여 OpenCL에 해당하는 장치 중 어느 것을 지정해야 합니다.그래서 우리 자신의 기계 안에 어떤 OpenCL 설비가 있는지 조사해 봅시다.원본 파일에main을 추가합니다.c 를 추가하고 다음 프로그램을 써서 실행하십시오.
#include <stdio.h>
#include <CL/cl.h>

int main(int argc, char **argv)
{

    // プラットフォーム取得
    cl_uint platformNumber = 0;
    cl_platform_id platformIds[8];
    clGetPlatformIDs(8, platformIds, &platformNumber);

    char string[256];
    cl_device_type type;
    cl_uint value;
    size_t sizes[3];
    cl_ulong ulvalue;
    for (int i = 0; i < platformNumber; i++)
    {
        printf("platform idx : %d\n", i);
        cl_platform_id platform = platformIds[i];
        clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, 256, string, NULL);
        printf("platform vendor : %s\n", string);
        clGetPlatformInfo(platform, CL_PLATFORM_NAME, 256, string, NULL);
        printf("platform name : %s\n", string);
        clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 256, string, NULL);
        printf("platform version : %s\n", string);

        // デバイス取得
        cl_uint deviceNumber = 0;
        cl_device_id deviceIds[8];
        clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 8, deviceIds, &deviceNumber);
        for (int j = 0; j < deviceNumber; j++)
        {
            printf("    device idx : %d\n", j);
            cl_device_id device = deviceIds[j];
            clGetDeviceInfo(device, CL_DEVICE_NAME, 256, string, NULL);
            printf("    device name : %s\n", string);
            clGetDeviceInfo(device, CL_DEVICE_TYPE, sizeof(cl_device_type), &type, NULL);
            if (type == CL_DEVICE_TYPE_CPU) printf("    device type : CPU\n");
            if (type == CL_DEVICE_TYPE_GPU) printf("    device type : GPU\n");
            if (type == CL_DEVICE_TYPE_ACCELERATOR) printf("    device type : ACCELERATOR\n");
            clGetDeviceInfo(device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(cl_uint), &value, NULL);
            printf("    device max compute units : %d\n", value);
            clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_ITEM_SIZES, sizeof(size_t) * 3, sizes, NULL);
            printf("    device max work item sizes : [%d][%d][%d]\n", sizes[0], sizes[1], sizes[2]);
            clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(cl_uint), &value, NULL);
            printf("    device max work group size : %d\n", value);
            clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(cl_ulong), &ulvalue, NULL);
            printf("    device max mem alloc size : %d\n", ulvalue);
            clGetDeviceInfo(device, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, sizeof(cl_ulong), &ulvalue, NULL);
            printf("    device max constant buffer size : %d\n", ulvalue);
        }
    }

}
실행해 보면 내 환경에서 다음과 같이 표시된다.

이것은 어떤 기계를 사용할지 생각하면서 사용하는 기계의plaatform idx와 device idx가 OpenCL 환경을 초기화하는 것을 나타낸다.

계속하다


다음은 간단한 내장 프로그램을 만들어서 OpenCL의 기본 사용 방법C++의 OpenCL (사용 편)을 이해한다.

좋은 웹페이지 즐겨찾기