car*_*urs 5 performance opencl
这是我正在研究的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;
}
}
Run Code Online (Sandbox Code Playgroud)
这个版本运行大约需要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;
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,代码比这更复杂(循环中还有很多其他的东西),但变量"无"实际上确实从前一个移动到紧接在大括号之后.
我是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;
}
Run Code Online (Sandbox Code Playgroud)
更新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;
}
}
Run Code Online (Sandbox Code Playgroud)
移动到哪里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;
}
}
Run Code Online (Sandbox Code Playgroud)
看来OpenCL是一件非常棘手的艺术!我仍然不明白发生了什么,但至少我知道如何解决它现在!
| 归档时间: |
|
| 查看次数: |
1012 次 |
| 最近记录: |