这是我正在研究的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 …Run Code Online (Sandbox Code Playgroud) 我正在使用 mpi4py 以元素方式减少跨多个进程的 numpy 数组。这个想法是将 numpy 数组按元素求和,这样如果我有两个进程,并且每个进程都有数组:
Rank 0: [1, 1, 1]
Rank 1: [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
减少后我应该有
[3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
这种情况下,使用如此短的数组,效果很好。
但是,在我的实际用例中,这些数组很长(array_length在我下面的示例代码中)。如果我发送长度小于或等于 505 个元素的 numpy 数组,我没有问题,但在此之上,我得到以下输出:
[83621b291fb8:01112] Read -1, expected 4048, errno = 1
Run Code Online (Sandbox Code Playgroud)
我一直无法找到任何记录在案的原因。然而,有趣的是,506*8 = 4048,这 - 假设有一些头数据 - 让我怀疑我在 mpi4py 或 MPI 本身的某处达到了 4kb 缓冲区限制。
我设法通过分解 numpy 数组来解决这个问题,我想按元素减少到大小为 200 的块(只是小于 505 的任意数字),并在每个块上调用 Reduce(),然后在主进程。然而,这有点慢。
有谁知道这是否确实是由于 mpi4py/MPI 中的 4kb 缓冲区限制(或类似)?
有没有比将数组切片并像我目前所做的那样多次调用 Reduce() 更好的解决方案,因为这似乎运行起来有点慢。
下面是说明
use_slices布尔值控制)使用 …