//////////////////////////////////
// host code
//////////////////////////////////
// ...
// select device/create context/build program
// ...
cl_kernel k_func_Test = nullptr;
k_func_Test = clCreateKernel(prog, "k_Test", &error);
size_t localsize = 3;
size_t globalsize = localsize * 2;
error = clEnqueueNDRangeKernel(command_queue, k_func_Test, 1, NULL, &globalsize_, &localsize_, 0, nullptr, nullptr);
clFinish(command_queue);
//////////////////////////////////
// kernel code
//////////////////////////////////
__kernel void k_Test()
{
if ((get_group_id(0) + get_group_id(1) + get_group_id(2)) == 0 &&
(get_local_id(0) + get_local_id(1) + get_local_id(2)) == 0)
{
printf("get_global_size = %d x %d x %d | " \
"get_local_size = %d x %d x %d | " \
"get_work_dim = %d \n" \
"////////////////////////////////////\n", \
get_global_size(0), get_global_size(1), get_global_size(2), \
get_local_size(0), get_local_size(1), get_local_size(2), \
get_work_dim()
);
}
printf("get_group_id = %d x %d x %d \n" \
"get_global_id = %d x %d x %d \n" \
"get_local_id = %d x %d x %d \n" \
"get_num_groups = %d x %d x %d \n" \
"////////////////////////////////////\n", \
get_group_id(0), get_group_id(1), get_group_id(2), \
get_global_id(0), get_global_id(1), get_global_id(2), \
get_local_id(0), get_local_id(1), get_local_id(2), \
get_num_groups(0), get_num_groups(1), get_num_groups(2)
);
}
不同工作内核代码我有3个装置:的OpenCL:为x86和x64版本
1)英特尔(R)核心(TM)i7-4790K CPU @ 4.00GHz
2)英特尔(R)HD显卡4600
3)的GeForce GTX 780钛
为x86的所有设备我得到这些结果:
////////////////////////////////////
get_global_size = 6 x 1 x 1 | get_local_size = 3 x 1 x 1 | get_work_dim = 1
////////////////////////////////////
get_group_id = 1 x 0 x 0
get_global_id = 3 x 0 x 0
get_local_id = 0 x 0 x 0
get_num_groups = 2 x 1 x 1
////////////////////////////////////
get_group_id = 1 x 0 x 0
get_global_id = 4 x 0 x 0
get_local_id = 1 x 0 x 0
get_num_groups = 2 x 1 x 1
////////////////////////////////////
get_group_id = 1 x 0 x 0
get_global_id = 5 x 0 x 0
get_local_id = 2 x 0 x 0
get_num_groups = 2 x 1 x 1
////////////////////////////////////
get_group_id = 0 x 0 x 0
get_global_id = 0 x 0 x 0
get_local_id = 0 x 0 x 0
get_num_groups = 2 x 1 x 1
////////////////////////////////////
get_group_id = 0 x 0 x 0
get_global_id = 1 x 0 x 0
get_local_id = 1 x 0 x 0
get_num_groups = 2 x 1 x 1
////////////////////////////////////
get_group_id = 0 x 0 x 0
get_global_id = 2 x 0 x 0
get_local_id = 2 x 0 x 0
get_num_groups = 2 x 1 x 1
////////////////////////////////////
但是,我开始为x64我得到了非常不同的结果。对于“英特尔(R)高清显卡4600” - 结果与x86版本相同。
但对于 “英特尔(R)酷睿(TM)i7-4790K CPU @ 4.00GHz” 和 “的GeForce GTX 780钛” 我得到了如下结果:
////////////////////////////////////
get_global_size = 6 x 0 x 1 | get_local_size = 0 x 1 x 0 | get_work_dim = 3
////////////////////////////////////
get_group_id = 1 x 0 x 0
get_global_id = 0 x 0 x 0
get_local_id = 3 x 0 x 0
get_num_groups = 0 x 0 x 0
////////////////////////////////////
get_group_id = 1 x 0 x 0
get_global_id = 0 x 0 x 0
get_local_id = 4 x 0 x 0
get_num_groups = 0 x 0 x 0
////////////////////////////////////
get_group_id = 1 x 0 x 0
get_global_id = 0 x 0 x 0
get_local_id = 5 x 0 x 0
get_num_groups = 0 x 0 x 0
////////////////////////////////////
get_group_id = 0 x 0 x 0
get_global_id = 0 x 0 x 0
get_local_id = 0 x 0 x 0
get_num_groups = 0 x 0 x 0
////////////////////////////////////
get_group_id = 0 x 0 x 0
get_global_id = 0 x 0 x 0
get_local_id = 1 x 0 x 0
get_num_groups = 0 x 0 x 0
////////////////////////////////////
get_group_id = 0 x 0 x 0
get_global_id = 0 x 0 x 0
get_local_id = 2 x 0 x 0
get_num_groups = 0 x 0 x 0
////////////////////////////////////
因此,正如我们所看到的结果的非常不同。例如在函数“clEnqueueNDRangeKernel”中,我们设置了参数work_dim = 1,但我不明白为什么对于x64版本的应用程序 - 它的工作方式不同!和get_work_dim()得到1或3(最后我想得到local_work_size的值)。
也许有人遇到过这个?执行不同的驱动程序?它是什么?