gpt4 book ai didi

c++ - OpenCL 内存访问

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:10 25 4
gpt4 key购买 nike

我目前正在使用 OpenCL 并尝试将数据写入一个数组,该数组将在以后从 CPU 中使用。本地工作组大小为“1”,全局工作组大小为数组大小。问题出在 kernel.cl 中:

__kernel void foo (..., __global int *a){
int test_array[2];
for (int i = 0; i<20; i++){
... // do something here
}
test_array[0] = 5;
int test = test_array[1];

a[gid] = test; // this throws an error at the graphical unit
a[gid] = test_array[0] // but this works if we assign test_array after the for-loop

当错误发生时,屏幕变黑一秒钟并返回错误代码“-5”(CL_OUT_OF_RESSOURCES),但这似乎是 Nvidia 默认错误代码。

对 test_array (int test..) 的读取表明我们能够读取它并且 a[gid]=test_array[0] 表明我们能够访问 a[] 数组但组合失败。

所以我的问题是:

  • 为什么我们不能在 for 循环之后将数据从 test_array 复制到 a[] 数组?

我很感激任何意见。

最佳答案

嘿,我是斯文的同事,

我们发现了问题。这不像我们想象的那样是一个内存问题,它更像是一个语义错误。

在循环内部,我们必须使用 if 语句。这个 if 语句不会像在 CPU 上那样被评估,我们需要一个线程来处理 if 的每个分支。所以我们必须将本地工作组大小从 1 更改为至少 2。这样所有线程都在 if 为 true 的情况下运行,而所有线程都在 false 语句下运行。错误的将被丢弃。

这会导致 NVIDIA 卡出错,但我不知道为什么。我们还测试了另一张 NVIDIA 卡,它也抛出 -5(CL_OUT_OF_RESSOURCES)。我们使用的 AMD 卡可以工作,但速度很慢。

非常感谢大家的评论,其中包含很多提示。但解决方案是成立一个更大的本地工作组来让它发挥作用。

关于c++ - OpenCL 内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26870077/

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