gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:49:53 25 4
gpt4 key购买 nike

这是我正在处理的 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;
}

正如我所说,代码比这更复杂(循环中还有很多其他的事情发生),但是变量“nothing”确实从大括号之前立即移动到了大括号之后。

我对 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;”在任何情况下都被任何合理的编译器作为死代码消除。

关于performance - OpenCL:为什么这两种情况的性能差异如此之大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7689680/

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