【发布时间】:2021-12-15 17:29:39
【问题描述】:
我正在尝试与 OpenCL 1.2 和 2.0 相关的不同事情。我找到了一个名为 Generic Address Space 的主题,并用指针尝试了一些东西。谁能告诉我为什么这段代码在我的 CPU 上执行良好(Intel i3 报告 OpenCL 2.1)并在我的 NVIDIA GeForce 940MX 上挂起 2 分钟。
void first(int *ptr) {
*ptr = 2;
}
__kernel void sampleKernel(__global const float *a, __global float *d) {
__private int gid = get_global_id(0);
__private int group_id = get_group_id(0);
__local int *ptr1;
ptr1 = 0;
first(&ptr1);
printf("ptr1: %u\n", ptr1);
}
我不希望在本地 int 指针方面对此代码有任何特定行为,但想了解这里发生了什么。
【问题讨论】:
-
对我来说看起来像是未定义的行为...不应该是
__local int ptr1;而不是__local int *ptr1;? -
@Jardel Lucca 是的。
-
正如你所说,bevahior 可能是未定义的,所以这就是它在某些设备上工作或不工作的原因。我还有一些其他示例在 CPU 上的常规 GCC 上运行良好,并且在 OpenCL C 上执行相同操作我得到不同的结果。在 OpenCL 中进行指针数学运算或寻址时,有什么重要的事情需要记住吗?
-
确实必须是
__local int ptr1;,否则你将值0设置为指针的地址。 OpenCL 可以像 C99 一样进行指针运算,但是在将变量传递给函数时,地址空间必须匹配。您可以写void first(__local int *ptr)或在调用first之前将ptr转换为__private int。
标签: c performance gpu opencl cpu