用printf打开OpenCL竞争条件?

时间:2015-07-06 01:40:59

标签: c printf opencl intel race-condition

我目前正在尝试测试是否可以在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行为的奇怪之处?

2 个答案:

答案 0 :(得分:2)

您的代码似乎有效(尽管代码中的while循环暂时令人困惑!;),您对正确输出的期望是合理的。

您的OpenCL安装似乎存在错误/问题。特别是AMD GPU OpenCL驱动程序存在我发现的printf行为问题。

有问题的printf 总是打印" Aello"和从不打印"(null)",就像你一样期望的。

问题可能是由于printf()的供应商实施中的竞争条件造成的。

答案 1 :(得分:0)

Printf OpenCL spec

我会小心“printf”函数,因为它可能不遵循OpenCL的正常逻辑。该规范说明了这一点:

  

当完成与特定内核调用关联的事件时,此内核调用执行的所有printf()调用的输出将刷新到实现定义的输出流。在命令队列上调用clFinish会将先前排队和已完成命令中printf的所有挂起输出刷新到实现定义的输出流。在同时从多个工作项执行printf的情况下,不保证对写入数据进行排序。例如,对于具有全局标识(0,0,1)的工作项的输出显示与具有全局标识(0,0,4)的工作项的输出混合是有效的,依此类推。