OpenCL get_global_id 和 get_local_id 使用 int 与 size_t?

OpenCL get_global_id and get_local_id using int vs. size_t?

我是 OpenCL 的新手,只是想掌握全局和本地工作规模。我正在尝试在我的主机代码中声明一个 2D 作品 space:

   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 只是一个无符号类型;我不明白为什么它会成功打印出第一个维度而不是第二个维度?

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

改用%zu


更长的解释:

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

因此,每个偶数实际上只是获取前一个偶数的高位,在这种情况下为 0。

Sent: AAAA0000 BBBB0000 CCCC0000 DDDD0000
Recv: AAAABBBB CCCCDDDD