2017-05-22 6 views
0

私はOpenCLの初心者で、グローバルとローカルのワークサイズのハングアップを試みています。OpenCLのget_global_idとget_local_idはintとsize_tを使用していますか?

size_t g_x = get_global_id(0); 
    size_t g_y = get_global_id(1); 
    size_t l_x = get_local_id(0); 
    size_t l_y = get_local_id(1); 

    printf("Thread (%d, %d, %d, %d)\n", g_x, g_y, l_x, l_y); 

しかし、唯一私:私は単にスレッドIDをプリントアウトしようとしている、私のカーネルコードで

size_t local[2] = {1,16}; 
    size_t global[2] = {1024, 16}; 

    // Execute the kernel for execution 
    status = clEnqueueNDRangeKernel(cmdQueue, kernel, 2, NULL, 
     global, local, 0, NULL, NULL); 

:私は私のホスト・コードでは、2Dのワークスペースを宣言しようとしています印刷する最初のディメンションを取得します(出力例)。

... 
Thread (1016, 0, 50, 0) 
Thread (1016, 0, 51, 0) 
Thread (1016, 0, 52, 0) 
Thread (1016, 0, 53, 0) 
Thread (1016, 0, 54, 0) 
... 

なぜこのようなことが起こりますか?私は次元の大きさで遊んだことがあるが、それは問題だとは思わない。

EDIT:size_tに置き換えると、正しい出力が得られます。しかし、なぜこれは? size_tは単に符号なしの型です。私はなぜそれが第一の次元を印刷するのに成功し、第二の次元は印刷しないのか分からない。

+0

は、ドライバの問題である可能性があります。 CL_DEVICE_ADDRESS_BITSとは何ですか? –

答えて

3

整数でないものを印刷する場合は、%dを使用しないでください。 size_tは現在使用しているデバイスによって異なり、unsigned 64bitsまたはunsigned 32bitsになります。

代わりに%zuを使用してください。


長い説明は:

あなたが見ている0は、印刷のそれは4つのint型を受信すると仮定しているためですが、4つのlong型を送っています。

したがって、すべての偶数は、実際には前のビットの上位ビットを取得しています。この場合、偶数は0です。

Sent: AAAA0000 BBBB0000 CCCC0000 DDDD0000 
Recv: AAAABBBB CCCCDDDD  
関連する問題