我是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只是一个无符号类型;我不明白为什么它会成功打印出第一个维度而不是第二个维度?
答案 0 :(得分:3)
您不应使用%d
打印任何非整数的内容。 size_t取决于您当前使用的设备,可以是unsigned 64bits
或unsigned 32bits
。
改为使用%zu
。
更长的解释:
你看到的0是因为打印假定它会收到4个整数,但是你发送4个长整数。
所以,每个偶数实际上只是得到前一个的高位,在这种情况下是0。
Sent: AAAA0000 BBBB0000 CCCC0000 DDDD0000
Recv: AAAABBBB CCCCDDDD