2016-09-29 48 views
2

所以我在GeForce GT 610上運行我的OpenCL程序。我知道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顯卡上運行得更好,但它真的限制了這麼多嗎? 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); 

...裏面for循環...

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只有一個SM,其中有48個內核。

因此,您不限於單個核心或該GPU的能力的1/48。訪問該計算單元意味着您的程序將可以訪問其中包含的48個內核。

+0

啊,這是有道理的。謝謝。我將如何去確定究竟有多少線程可以在此設備上並行運行? – danglingPointer

+1

您可以啓動使用多個線程(工作項目)的OpenCL內核。 GPU將以任何速度處理它們。 GPU的瞬時容量是指定的(例如1536個工作項目可以駐留在費米SM上),但這不*意味着您應該考慮編寫使用1536個工作項目的全球規模(或當地規模)的程序物)。使用大量的工作結構來解決問題。在這種情況下,不要擔心擔心1536號碼。 –