그래서 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);
아, 맞아. 고맙습니다. 이 장치에서 얼마나 많은 스레드를 병렬로 실행할 수 있는지 정확히 알면 어떻게 될까요? – danglingPointer
많은 스레드 (작업 항목)를 사용하는 OpenCL 커널을 시작할 수 있습니다. GPU는 가능한 속도로 처리합니다. GPU의 순시 용량이 지정됩니다 (예 : 1536 작업 항목이 Fermi SM 당 상주 할 수 있음). 그러나 이것은 전체 크기 (또는 로컬 크기)에 대해 1536 작업 항목을 사용하는 프로그램 작성에 대해 생각하지 않아도됩니다 문제). 당신의 문제에 맞는 큰 작업 구조를 사용하십시오. 이 경우 1536 번호에 대해 걱정하지 마십시오. –