当前位置 : 主页 > 网络安全 > 测试自动化 >

OpenCL:为什么这两种情况之间的性能差异如此之大?

来源:互联网 收集:自由互联 发布时间:2021-06-22
这是我正在研究的OpenCL内核的两段代码;它们显示出截然不同的运行时间. 代码相当复杂,所以我简化了它. 这个版本在一秒钟内运行: for (int ii=0; iisomeNumber;ii++){ for (int jj=0; iisomeNumber2;j
这是我正在研究的OpenCL内核的两段代码;它们显示出截然不同的运行时间.

代码相当复杂,所以我简化了它.

这个版本在一秒钟内运行:

for (int ii=0; ii<someNumber;ii++)
{
    for (int jj=0; ii<someNumber2;jj++)
    {
        value1 = value2 + value3;
        value1 = value1 * someFunction(a,b,c);
        double nothing = value1;
    }
}

这个版本运行大约需要38秒:

for (int ii=0; ii<someNumber;ii++)
{
    for (int jj=0; ii<someNumber2;jj++)
    {
        value1 = value2 + value3;
        value1 = value1 * someFunction(a,b,c);
    }
    double nothing = value1;
}

正如我所说,代码比这更复杂(循环中还有很多其他的东西),但变量“无”实际上确实从前一个移动到紧接在大括号之后.

我是OpenCL的新手,我无法解决发生的事情,更不用说如何修复它了.毋庸置疑,缓慢的情况实际上是我在实施中所需要的.我试过搞乱地址空间(这里的所有变量都在__private中).

我只能想象,由于某种原因,当支架关闭时,GPU正在将变量“value1”推送到较慢的内存中.这可能是一个解释吗?我能做什么?

提前致谢!

更新:这也在不到一秒的时间内运行:(但是如果没有注释任何一行,它将恢复到极端缓慢).这不会对循环进行任何其他更改,并且value1仍然在与之前相同的位置声明.

for (int ii=0; ii<someNumber;ii++)
{
    for (int jj=0; ii<someNumber2;jj++)
    {
//        value1 = value2 + value3;
//        value1 = value1 * someFunction(a,b,c);
    }
    double nothing = value1;
}

更新2:代码实际上嵌套在另一个循环中,如下所示声明value1:

double value1=0;
for (int kk=0; kk<someNumber3;kk++)
{
    for (int ii=0; ii<someNumber;ii++)
    {
        for (int jj=0; ii<someNumber2;jj++)
        {
            value1 = value2 + value3;
            value1 = value1 * someFunction(a,b,c);
        }
        double nothing = value1;
    }
}

移动value1的位置也让我们回到了快速的情况:

for (int kk=0; kk<someNumber3;kk++)
{
    double value1=0;
    for (int ii=0; ii<someNumber;ii++)
    {
        for (int jj=0; ii<someNumber2;jj++)
        {
            value1 = value2 + value3;
            value1 = value1 * someFunction(a,b,c);
        }
        double nothing = value1;
    }
}

看来OpenCL是一件非常棘手的艺术!我仍然不明白发生了什么,但至少我知道如何解决它现在!

您使用的是什么实现?我希望“double nothing = value1;”在任何情况下由任何合理的编译器作为死代码被删除.
网友评论