Programing

이론적으로 C ++ 구현이 두 함수 인수의 평가를 병렬화 할 수 있습니까?

crosscheck 2020. 11. 9. 07:49
반응형

이론적으로 C ++ 구현이 두 함수 인수의 평가를 병렬화 할 수 있습니까?


다음 함수 호출이 제공됩니다.

f(g(), h())

함수 인자의 평가 순서는 (내가 알고 있어요 지금처럼 11 ++ C에서 여전히 경우) 지정되지 않은이기 때문에, 구현은 이론적으로 실행할 수 g()h()병렬로?

이러한 parallelisation 만이었다에 찰 수 gh매우 사소한 것으로 알려져 (가장 명백한 경우에, 몸에 지방에만 데이터에 액세스) 않도록 동시성 문제를 소개하지 만, 그 제한을 넘어 나는 그것을 금지 아무것도 볼 수 없습니다 .

그래서, 표준이 그것을 허용합니까? as-if 규칙에 의해서만?

( 이 답변 에서 Mankarse는 달리 주장하지만 그는 표준을 인용하지 않았으며 내가 읽은 내용 [expr.call]은 명백한 문구를 공개하지 않았습니다.)


요구 사항은 다음과 [intro.execution]/15같습니다.

... 함수를 호출 할 때 ... 호출 된 함수의 본문 실행 전후에 특별히 순서가 지정되지 않은 호출 함수 (다른 함수 호출 포함)의 모든 평가는 실행 과 관련하여 불확실하게 시퀀스가 ​​지정 됩니다. 함수 호출 [각주 : 즉, 함수 실행이 서로 인터리브되지 않습니다. ].

따라서의 본문 실행은 ( 호출 함수의 표현식 이므로 g()) 평가와 함께 (즉, 겹치지 않음) 불확실하게 순서가 지정되어야합니다 .h()h()

여기에서 중요한 점은 것입니다 g()h()두 함수 호출이다.

(물론 as-if 규칙은 가능성을 완전히 배제 할 수는 없지만 프로그램의 관찰 가능한 동작에 영향을 미칠 수있는 방식으로 발생해서는 안됩니다. 기껏해야 이러한 구현은 성능 특성 만 변경합니다. 코드.)


알 수없는 한 컴파일러가 이러한 함수를 평가하기 위해 수행하는 작업은 전적으로 컴파일러에 달려 있습니다. 분명히, 함수의 평가는 데이터 경쟁을 일으킬 수 있으므로 공유되고 변경 가능한 데이터에 대한 액세스를 포함 할 수 없습니다. 기본 지침 원칙은 "as if"규칙과 관찰 가능한 기본 작업, 즉 volatile데이터 액세스 , I / O 작업, 원자 데이터 액세스 등입니다. 관련 섹션은 1.9 [intro.execution]입니다.


아니 컴파일러가 정확히 무엇을 알고하지 않는 한 g(), h()그들은 않습니다 전화, 아무것도.

두 표현식은 함수 호출이며 알려지지 않은 부작용이있을 수 있습니다. 따라서 병렬화하면 이러한 부작용에 대한 데이터 경쟁이 발생할 수 있습니다. C ++ 표준은 인수 평가가 표현식의 부작용에 대해 데이터 경합을 유발하는 것을 허용하지 않기 때문에 컴파일러는 그러한 데이터 경합이 가능하지 않다는 것을 알고있는 경우에만이를 병렬화 할 수 있습니다.

즉, 각 함수를 살펴보고 그들이하는 일 및 / 또는 호출을 정확히 살펴본 다음 해당 함수 를 추적 하는 등의 작업을 수행해야 합니다. 일반적인 경우에는 불가능합니다.


쉬운 대답 : 함수가 순서화 될 때, 불확실하더라도 둘 사이에 경쟁 조건이있을 가능성이 없으며 병렬화되면 참이 아닙니다. 한 쌍의 "사소한"기능도 가능합니다.

void g()
{
    *p = *p + 1;
}


void h()
{
    *p = *p - 1;
}

경우는 pa로 공유 이름 gh의 다음 순차적으로 호출 g하고 h값이 가리키는 발생합니다 임의의 순서로 p변경하지. 병렬화 된 경우 읽기 *p및 할당이 둘 사이에 임의로 인터리브 될 수 있습니다.

  1. g*p값 1을 읽고 찾습니다.
  2. f*p값 1을 읽고 또한 찾습니다.
  3. g2를 *p.
  4. f, 여전히 이전에 읽은 값 1을 사용하면 0을 씁니다 *p.

따라서 병렬화 될 때 동작이 다릅니다.

참고 URL : https://stackoverflow.com/questions/13443532/could-ac-implementation-in-theory-parallelise-the-evaluation-of-two-functio

반응형