使用int与size_t的OpenCL get_global_id和get_local_id?

时间:2017-05-22 06:49:35

标签: opencl

我是OpenCL的新手,只是试图了解全球和本地工作规模。我试图在我的主机代码中声明一个2D工作空间:

   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);

在我的内核代码中,我只是试图打印出线程ID:

   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);

但是,我只得到第一个要打印的尺寸(这里是输出样本):

...
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)
...

为什么会这样?我已经玩过尺寸尺寸,但我不认为这是问题所在。

编辑:当我用 int 替换 size_t 时,我得到了正确的打印输出。但为什么会这样呢? size_t只是一个无符号类型;我不明白为什么它会成功打印出第一个维度而不是第二个维度?

1 个答案:

答案 0 :(得分:3)

您不应使用%d打印任何非整数的内容。 size_t取决于您当前使用的设备,可以是unsigned 64bitsunsigned 32bits

改为使用%zu

更长的解释:

你看到的0是因为打印假定它会收到4个整数,但是你发送4个长整数。

所以,每个偶数实际上只是得到前一个的高位,在这种情况下是0。

Sent: AAAA0000 BBBB0000 CCCC0000 DDDD0000
Recv: AAAABBBB CCCCDDDD