通用 openMP - 线程速度不同
General openMP - thread speeds are different
我有一个 openMP 程序,其中一个 for 循环是并行化的。
一切正常,除了主线程比其他线程快很多很多倍...例如,当 运行 4 个线程时,线程 0 比其他线程早完成,但它们正在执行相同的代码,几乎相同的工作量。
这会不会是因为 Windows 的资源处理,在程序使用的线程中交换任务,导致速度变慢?
还是我的代码更有可能是问题所在?我只是想确保我不会浪费时间在我的程序中寻找错误,如果这是由 OS...
引起的不可避免的问题
看线程的执行取决于很多事情,所以可能有很多可能性,比如是否存在任何锁定机制或资源可用性,比如当线程完成作业时它必须释放资源。还有更多的因素。所以我的建议是使用一个名为 vtune 的工具并分析你的代码,它会让你清楚地知道你的线程在哪里浪费时间以及为什么。希望对你有帮助。
至于为什么线程有优先级,可能是OpenMP运行时和OS之间的问题。你使用哪个编译器?您如何测量线程何时终止?
在这种情况下,为了提高 OpenMP 并行的性能,我将使用带有 schedule 指令的动态调度策略。如果主线程从 CPU 获得更多周期,在这种情况下它也会做更多工作。通常,您不能指望每个线程都同样快,但如果您观察到数量级差异,这听起来像是运行时和 OS.
之间的严重冲突。
我有一个 openMP 程序,其中一个 for 循环是并行化的。 一切正常,除了主线程比其他线程快很多很多倍...例如,当 运行 4 个线程时,线程 0 比其他线程早完成,但它们正在执行相同的代码,几乎相同的工作量。
这会不会是因为 Windows 的资源处理,在程序使用的线程中交换任务,导致速度变慢? 还是我的代码更有可能是问题所在?我只是想确保我不会浪费时间在我的程序中寻找错误,如果这是由 OS...
引起的不可避免的问题看线程的执行取决于很多事情,所以可能有很多可能性,比如是否存在任何锁定机制或资源可用性,比如当线程完成作业时它必须释放资源。还有更多的因素。所以我的建议是使用一个名为 vtune 的工具并分析你的代码,它会让你清楚地知道你的线程在哪里浪费时间以及为什么。希望对你有帮助。
至于为什么线程有优先级,可能是OpenMP运行时和OS之间的问题。你使用哪个编译器?您如何测量线程何时终止?
在这种情况下,为了提高 OpenMP 并行的性能,我将使用带有 schedule 指令的动态调度策略。如果主线程从 CPU 获得更多周期,在这种情况下它也会做更多工作。通常,您不能指望每个线程都同样快,但如果您观察到数量级差异,这听起来像是运行时和 OS.
之间的严重冲突。