2016-09-29 2 views
2

그래서 OpenCL 프로그램을 GeForce GT 610에서 실행하고 있습니다. CUDA가 더 나은 대안이 될 것이라는 것을 알고 있으며 나중에 CUDA 버전의 코드를 작성할 수 있습니다. 그러나 OpenCL에서 작성 중임을 알고 있기 때문에 AMD 그래픽 카드에서 실행할 수 있습니다.OpenCL : 단일 컴퓨팅 장치가 GPU에 있습니까?

초기화하는 동안 실행할 장치를 선택합니다. 다음은이 단계에서 내 프로그램이 인쇄하는 내용입니다.

OpenCL Platform 0: NVIDIA CUDA 
----- OpenCL Device # 0: GeForce GT 610----- 
Gflops: 1.620000 
Max Compute Units: 1 
Max Clock Frequency: 1620 
Total Memory of Device (bytes): 1072889856 
Max Size of Memory Object Allocation (bytes): 268222464 
Max Work Group Size: 1024 

제 질문은 왜 최대 계산 단위가 1이라고 말합니까? GeForce 사이트의 사양 세부 사항에 따르면 it has 48 CUDA cores. 나는 CUDA가 Nvidia 카드에서 더 잘 실행된다는 것을 알고 있지만 실제로이 점을 많이 제한합니까? 엔비디아는 OpenCL을 1/48로 제한합니까? 내 질문은 왜 최대 컴퓨팅을 말하는가있다

if (clGetPlatformInfo(platforms[platform], CL_PLATFORM_NAME, sizeof(name), name, NULL)) Fatal("Cannot get OpenCL platform name\n"); 
if (verbose) printf("OpenCL Platform %d: %s\n", platform, name); 

... 내부 forloop ...

cl_uint compUnits, freq; 
    cl_ulong memSize, maxAlloc; 
    size_t maxWorkGrps; 

    if (clGetDeviceInfo(id[devId], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compUnits), &compUnits, NULL)) Fatal("Cannot get OpenCL device units\n"); 
    if (clGetDeviceInfo(id[devId], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(freq), &freq, NULL)) Fatal("Cannot get OpenCL device frequency\n"); 
    if (clGetDeviceInfo(id[devId], CL_DEVICE_NAME, sizeof(name), name, NULL)) Fatal("Cannot get OpenCL device name\n"); 

    if (clGetDeviceInfo(id[devId], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(memSize), &memSize, NULL)) Fatal("Cannot get OpenCL memory size.\n"); 
    if (clGetDeviceInfo(id[devId], CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(memSize), &maxAlloc, NULL)) Fatal("Cannot get OpenCL memory size.\n"); 

    if (clGetDeviceInfo(id[devId], CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(maxWorkGrps), &maxWorkGrps, NULL)) Fatal("Cannot get OpenCL max work group size\n"); 

    int Gflops = compUnits * freq; 

    if (verbose) printf(" ----- OpenCL Device # %d: %s-----\n" 
    "Gflops: %f\n" 
    "Max Compute Units: %d\n" 
    "Max Clock Frequency: %d\n" 
    "Total Memory of Device (bytes): %lu\n" 
    "Max Size of Memory Object Allocation (bytes): %lu\n" 
    "Max Work Group Size: %d\n", 
    devId, 
    name, 
    1e-3*Gflops, 
    compUnits, 
    freq, 
    memSize, 
    maxAlloc, 
    maxWorkGrps); 

답변

4

: 여기

무엇처럼 내 코드가 인쇄 다음과 같은 모습입니다 단위는 1입니까?

여기서 말하는 계산 단위는 NVIDIA GPU SM (스트리밍 다중 프로세서)에 해당합니다. 이 GPU에는 정확히 48 개의 코어가있는 SM이 하나 있습니다.

따라서 단일 코어 또는 GPU 기능의 1/48에 국한되지 않습니다. 해당 계산 장치에 액세스하면 프로그램에 포함 된 48 개의 코어에 액세스 할 수 있습니다.

+0

아, 맞아. 고맙습니다. 이 장치에서 얼마나 많은 스레드를 병렬로 실행할 수 있는지 정확히 알면 어떻게 될까요? – danglingPointer

+1

많은 스레드 (작업 항목)를 사용하는 OpenCL 커널을 시작할 수 있습니다. GPU는 가능한 속도로 처리합니다. GPU의 순시 용량이 지정됩니다 (예 : 1536 작업 항목이 Fermi SM 당 상주 할 수 있음). 그러나 이것은 전체 크기 (또는 로컬 크기)에 대해 1536 작업 항목을 사용하는 프로그램 작성에 대해 생각하지 않아도됩니다 문제). 당신의 문제에 맞는 큰 작업 구조를 사용하십시오. 이 경우 1536 번호에 대해 걱정하지 마십시오. –

관련 문제