这是我正在研究的OpenCL内核的两段代码;它们显示出截然不同的运行时间. 代码相当复杂,所以我简化了它. 这个版本在一秒钟内运行: for (int ii=0; iisomeNumber;ii++){ for (int jj=0; iisomeNumber2;j
代码相当复杂,所以我简化了它.
这个版本在一秒钟内运行:
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;”在任何情况下由任何合理的编译器作为死代码被删除.