gpt4 book ai didi

c++ - OpenCL : different work kernel code for the x86 and x64 versions

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:29 26 4
gpt4 key购买 nike

//////////////////////////////////
// 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 台设备:

1) Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz

2) 英特尔(R) 高清显卡 4600

3) GeForce GTX 780 Ti

对于 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 开始,得到了非常不同的结果。对于“Intel(R) HD Graphics 4600”- 结果与 x86 版本相同。

但对于“Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz”和“GeForce GTX 780 Ti”,我得到了以下结果:

////////////////////////////////////
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 的值)。

也许有人经历过这个?执行不同的驱动程序?这是什么?

最佳答案

我相信您的问题可能在于调用 printf 时使用的格式说明符。

OpenCL C 内置函数 get_global_size()、get_local_size()、get_num_groups()、get_global_id()、get_local_id() 和 get_group_id() 都返回一个 size_t 值。 size_t 类型根据架构的地址宽度而不同;它的大小等于指针的大小(即 sizeof(size_t) == sizeof(void *)),因此在 x86 上 size_t 是 4 字节,在 x86_64 上 size_t 是 8 字节。因为这个 printf 有 size_t 值的“%zu”格式说明符。这可能解释了为什么您在 x86 和 x86_64 内核构建上看到不同的输出。

此外,OpenCL C 内置的 get_work_dim() 返回一个无符号整数值,为此您应该使用“%u”格式说明符。

也许可以为您的内核尝试这个:

__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 = %zu x %zu x %zu | " \
"get_local_size = %zu x %zu x %zu | " \
"get_work_dim = %u \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 = %zu x %zu x %zu \n" \
"get_global_id = %zu x %zu x %zu \n" \
"get_local_id = %zu x %zu x %zu \n" \
"get_num_groups = %zu x %zu x %zu \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)
);
}

关于c++ - OpenCL : different work kernel code for the x86 and x64 versions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35725250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com