2016-09-29 8 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); 

... 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が1つしかありません。

したがって、そのGPUの機能の1/48または1/48に限定されません。そのコンピュートユニットにアクセスすると、プログラムに含まれている48個のコアにアクセスできることを意味します。

+0

ああ、意味があります。ありがとうございました。このデバイスで並列に実行できるスレッドの数を正確に把握するにはどうすればよいですか? – danglingPointer

+1

多くのスレッド(作業項目)を使用するOpenCLカーネルを起動できます。 GPUは、それが可能な速度で処理します。 GPUの瞬時容量が指定されています(例えば、1536個の作業項目がFermi SMに常駐することができます)。しかし、これは、グローバルサイズ(またはそのローカルサイズ)に対して1536個の作業項目を使用するプログラムを書くことについて考えるべきではありません問題)。あなたの問題に合った大きな作業構造を使用してください。この場合、1536番号について心配することはありません。 –

関連する問題