gpt4 book ai didi

c - OpenCL 1.2 使用有效内核给出 -9999 错误

转载 作者:行者123 更新时间:2023-11-30 14:57:30 25 4
gpt4 key购买 nike

我有以下内核:

#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#include <kernel_dependencies/complex_operations.h>
#include <kernel_dependencies/integer_operations.h>

__kernel void execute(__global long *a0, __global long *a1, ulong vo0, ulong vs0_0, ulong vo1, ulong vs1_0) {
const ulong i0 = get_global_id(0);

if (i0 >= 2) {
return;
}

long s1_1;
s1_1 = a1[35+i0*-6]; // <-- PROBLEM IS HERE
const ulong idx0= (vo0 +i0*vs0_0);
a0[idx0] = s1_1 + s1_1;
}

在我的 Telsa P100-PCIE-16GB 上使用 OpenCL C 1.2 运行此命令会在 clWaitForEvents 上出现 -9999 错误。我已将错误范围缩小到索引为 a1 。我尝试过这样做:

s1_1 = a1[35];

相反,它工作得很好(尽管它给出了错误的结果)。我也尝试过 29 ,这是表达式 35+i0*-6 的唯一其他结果。我还尝试了表达式的各种其他配置,即以下所有给出了此 -9999 错误:

a1[(35 + i0 * -6)];
a1[35 + (i0 * -6)];
a1[35 + -(i0 * 6)];
a1[(-6 * i0) + 35];

如果我将表达式放入变量中,例如ulong t = 35+i0*-6; s1_1 = a1[t];我仍然遇到同样的错误。我可以输入 printf并验证该变量实际上包含 3529 .

long s1_1; 
ulong t = 35+i0*-6;
printf("%lu\n", t); // <-- This prints '35' first time and '29' second time.
s1_1 = a1[t];

我在这里缺少什么?我做错了什么?

最佳答案

我们找出了问题所在。

鉴于i0是一个ulong,它是无符号的。将其与 -6 相乘将使其向上转换。 ulongs 似乎只能向上转换为 floats (这看起来很合理),所以现在我们有 i0 作为 float 乘以-6 作为 float 。这最终成为一个 float 类型,我无法用它来索引我的数组,因此我得到一个“段错误”,或者在本例中为“-9999”。

i0 更改为 int 将导致它不进行强制转换,就像 -6i0 现在可以的那样成倍增加。

关于c - OpenCL 1.2 使用有效内核给出 -9999 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43887942/

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