我目前正在尝试测试是否可以在OpenCL内核(英特尔SDK)中使用一些基本操作(读写内存)。这是代码的一部分 - 省略了一些未使用的参数:
__kernel
void myfunc(__global char *buf_pw,
__global char *buf_hash)
{
int idx = get_global_id(0);
int a = 1 + 1;
char wololol[8] = "wololol";
if (idx == 0 )
{
buf_pw[0] = 'A';
buf_pw[1] = 'e';
buf_pw[2] = 'l';
buf_pw[3] = 'l';
buf_pw[4] = 'o';
buf_pw[5] = 0;
}
if (idx == 0)
{
while(buf_pw[0] != 'A');
printf("%c\n", buf_pw[0]);
printf("%c\n", buf_pw[1]);
printf("%c\n", buf_pw[2]);
printf("%c\n", buf_pw[3]);
printf("%c\n", buf_pw[4]);
printf("%c\n", buf_pw[5]);
printf("%s\n", buf_pw);
printf("%s\n", wololol);
}
printf("Hello World\n");
}
多次运行程序会产生不同的结果。大多数情况下,它产生的输出看起来像:
A
e
l
l
o
(null)
wololol
Hello World
Hello World
Hello World
Hello World
另一个案例是:
A
e
l
l
o
Aello
wololol
Hello World
Hello World
Hello World
Hello World
我预计第二种情况是正确的输出,但很少发生。什么导致写作/阅读pw行为的奇怪之处?
答案 0 :(得分:2)
您的代码似乎有效(尽管代码中的while循环暂时令人困惑!;),您对正确输出的期望是合理的。
您的OpenCL安装似乎存在错误/问题。特别是AMD GPU OpenCL驱动程序存在我发现的printf行为问题。
有问题的printf 总是打印" Aello"和从不打印"(null)",就像你一样期望的。
问题可能是由于printf()的供应商实施中的竞争条件造成的。
答案 1 :(得分:0)
我会小心“printf”函数,因为它可能不遵循OpenCL的正常逻辑。该规范说明了这一点:
当完成与特定内核调用关联的事件时,此内核调用执行的所有printf()调用的输出将刷新到实现定义的输出流。在命令队列上调用clFinish会将先前排队和已完成命令中printf的所有挂起输出刷新到实现定义的输出流。在同时从多个工作项执行printf的情况下,不保证对写入数据进行排序。例如,对于具有全局标识(0,0,1)的工作项的输出显示与具有全局标识(0,0,4)的工作项的输出混合是有效的,依此类推。