我有一个内核方法,简化看起来像这样。
getInstance()
所以,除了简单的计算和非常大的循环之外,问题是程序在我运行此代码时一直冻结。 每次发生这种情况时我都必须强制重置计算机。 但如果我做了一些改变,比如这个
__kernel void calculate (__global float *a, __global float *b, __global int *res) {
int workItem = get_global_id(0); // Syntax may not right, but you get the idea
int found = 0;
for (int i = 0; i<100000000; i++) {
float c = a[i]*3;
float d = b[i]*2;
if (c<d) {
found++;
}
}
res[workItem]= found;
}
或
if (true) {
found++;
}
然后程序就像一个魅力,非常快!所以我想知道变量c和d是否有任何问题?我尝试使用像
这样的东西if (1<2) {
found++
}
它也没有用。
我在创建程序和内核时读取了每一步的返回码,所以不是问题。
我在这里做错了什么?
答案 0 :(得分:1)
这里有几个问题。
get_global_id()
检索的值,但输出除外。但是,由于他们都使用相同的输入,您将为每个工作项获得相同的输出!工作项及其关联的全局ID旨在允许您将处理划分为离散单元,而不是一个大的单片循环。我建议你看一些像this one这样的教程来更好地理解这个概念。在你理解他的代码之前,不要开始编写自己的代码。
至于为什么你的程序会冻结你的电脑,我只能在没有看到主机代码的情况下进行推测。也许你得到了buffer overrun?