我在主机openMP代码中使用intel的offload pragma。代码如下所示
int s1 = f(a,b,c);
#prama offload singnal(s1) in (...) out(x:len)
{
for (int i = 0; i < len; ++i)
{
x[i] = ...
}
}
#pragma omp parallel default(shared)
{
#pragma omp for schedule(dynamic) nowait
for (int i = 0; i < count; ++i)
{
/* code */
}
#pragma omp for schedule(dynamic)
for (int j = 0; j < count2; ++j)
{
/* code */
}
}
#pragma offload wait(s1)
{
/* code */
}
代码卸载计算$ x $到MIC。代码通过向CPU核心提供一些openMP来保持自己的忙碌。上面的代码按预期工作。然而,第一个卸载pragma花费了大量时间并且已经成为瓶颈。不过总的来说,将$ x $的计算卸载到MIC是值得的。一种可能克服这种延迟问题的方法我尝试如下
int s1 = f(a,b,c);
#pragma omp parallel default(shared)
{
#pragma omp single nowait
{
#prama offload singnal(s1) in (...) out(x:len)
{
for (int i = 0; i < len; ++i)
{
x[i] = ...
}
}
}
#pragma omp for schedule(dynamic) nowait
for (int i = 0; i < count; ++i)
{
/* code */
}
#pragma omp for schedule(dynamic)
for (int j = 0; j < count2; ++j)
{
/* code */
}
}
#pragma offload wait(s1)
{
/* code */
}
这个新代码,指定一个线程来执行卸载,而其他openmp线程可以用于其他工作共享结构。但是这段代码不起作用。我收到以下错误消息
device 1 does not have a pending signal for wait(0x1)
卸载上面代码段的报告点是罪魁祸首。一个临时工作是使用常数作为信号,即信号(0),它起作用。但是,我需要一个更持久的解决方案。任何人都可以了解我的代码中出了什么问题。
由于
答案 0 :(得分:1)
让我补充泰勒的答复。
第一次卸载确实需要比后续卸载更多的时间,因为正在进行初始化的事情。泰勒勾画了那里发生的一些事情。您可以使用环境变量OFFLOAD_INIT = on_start来避免虚拟卸载。这应该让运行时系统提前完成所有初始化。此开销不会消失,但会从第一次卸载转移到应用程序初始化。
第二个代码段的问题似乎是您的卸载目标是不同的设备。仅当信号和等待发生在同一目标设备上时,信令和等待才有效。由于您没有在卸载时明确使用target(mic:0)
子句,因此运行时系统选择不同的目标设备的可能性很高。
我想提出的一个建议是不使用普通整数来表示信令。通常,信号表示某个缓冲区已就绪。在这些情况下,最好将缓冲区指针用作信号句柄,因为对于使用不同缓冲区的并发卸载,它将是唯一的。
干杯, -Michael
答案 1 :(得分:0)
我无法对第二个代码块发表评论。我对第一个有一些看法。
第一次卸载总是花费更长的时间,因为它还设置了卸载基础架构。这个结构包括传递环境变量,复制libomp5的麦克风实现,设置线程池等等。
避免这种情况的方法是首先设置一个虚拟卸载,这意味着它不会做任何事情并且不属于你的计算块。
关于优化xeon phi协处理器的一系列优秀参考资料位于software.intel.com/mic-developer的培训选项卡下。
另请参阅software.intel.com/en-us/articles/programming-and-compiling-for-intel-many-integrated-core-architecture,software.intel.com/en-us/articles/优化和性能调整 - 用于intel-xeon-phi-coprocessors-part-1-optimization,以及software.intel.com/en-us/articles/optimization-and-performance-tuning-for-intel-xeon -phi-协处理器部分-1-优化。
很抱歉长网址但是stackoverflow不允许我包含两个以上的链接,因为我是新的。