[评测Bug]评测时采用并行计算的Bug
  • 板块工单反馈版
  • 楼主zymooll
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/4/14 21:44
  • 上次更新2023/10/23 18:29:35
查看原帖
[评测Bug]评测时采用并行计算的Bug
289296
zymooll楼主2023/4/14 21:44

写在前面

先说明为什么觉得多线程在 Luogu 非法.

  • 第一点,Luogu 主要面对算法竞赛,而在中国主要的 NOI 系列比赛中并不允许使用并行计算,参见如下:

    4.选手程序中只允许通过对指定文件的读写、以及对指定库函数的调用等题目中明确规定的方式与外部环境通信。在程序中严禁下列操作:
    
    ...
    
    使用fork、exec、system或其它线程/进程生成函数
    
    ...
    

    参阅 Link

  • 第二点,据 Luogu 提供的 洛谷在线 IDE 中尝试编译常见的多线程头文件,无法编译.

    注:第一张图为编译 thread.h 第二张图为编译 pthread.

  • 第三点,本人认为多线程作为一个技术本身是没有错的,但是在算法竞赛中,在讲究时空限制的程序设计中,采用并行计算技术必然是不合法的.

Bug 简述

自 C++17 起加入了并行计算库 execution,其可以在部分函数中执行特定策略,其中特别需要注意的就是 std::execution::par 策略,其可以在调用部分函数时进行并行计算,参见如下:

std::execution::sequenced_policy, 
std::execution::parallel_policy, 
std::execution::parallel_unsequenced_policy, 
std::execution::unsequenced_policy

 C++ 算法库 
在标头 <execution> 定义
class sequenced_policy { /* unspecified */ };
(1)	(C++17 起)
class parallel_policy { /* unspecified */ };
(2)	(C++17 起)
class parallel_unsequenced_policy { /* unspecified */ };
(3)	(C++17 起)
class unsequenced_policy { /* unspecified */ };
(4)	(C++20 起)
1) 以该执行策略类型为一种独有类型,对并行算法重载消歧义,并要求并行算法的执行可以不并行化。以此策略调用(通常以 std::execution::seq 指定)的并行算法中,元素访问函数的调用在调用方线程中是非确定顺序的。
2) 以该执行策略类型为一种独有类型,对并行算法重载消歧义,并指示并行算法的执行可以并行化。以此策略调用(通常以 std::execution::par 指定)的并行算法中,元素访问函数的调用允许在调用方线程,或由库隐式创建的线程中执行,以支持并行算法执行。任何执行于同一线程中的这种调用彼此间是非确定顺序的,
3) 以该执行策略类型为一种独有类型,对并行算法重载消歧义,并指示并行算法的执行可以并行化、向量化,或在线程间迁移(例如用亲窃取的调度器)。容许以此策略调用的并行算法中的元素访问函数调用在未指定线程中以无序方式执行,并相对于每个线程中的另一调用无顺序。
...

引用自 Link

关键在于第二点表明了 以此策略调用(通常以 std::execution::par 指定)的并行算法中,元素访问函数的调用允许在调用方线程,或由库隐式创建的线程中执行,以支持并行算法执行。.

说明其采用了多线程技术(实际上是 Intel(R) 的 TBB 库).

Bug 复现

在 洛谷在线 IDE 中尝试调用 std::execution::par,调用成功,参见:

注:该代码简要实现了排序算法.

在评测时,该 Bug 同样也可供利用,在题目 P1177 【模板】快速排序 中采用并行算法的代码吊打正常单线程的算法,参见:

评测记录见:Link (38ms)

后话

感谢各位管理员大大的耐心阅读,如果可以的话能否发个 Tag 给厚颜无耻的我(逃

2023/4/14 21:44
加载中...