이론적으로 C ++ 구현이 두 함수 인수의 평가를 병렬화 할 수 있습니까?
다음 함수 호출이 제공됩니다.
f(g(), h())
함수 인자의 평가 순서는 (내가 알고 있어요 지금처럼 11 ++ C에서 여전히 경우) 지정되지 않은이기 때문에, 구현은 이론적으로 실행할 수 g()
및 h()
병렬로?
이러한 parallelisation 만이었다에 찰 수 g
와 h
매우 사소한 것으로 알려져 (가장 명백한 경우에, 몸에 지방에만 데이터에 액세스) 않도록 동시성 문제를 소개하지 만, 그 제한을 넘어 나는 그것을 금지 아무것도 볼 수 없습니다 .
그래서, 표준이 그것을 허용합니까? 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;
}
경우는 p
a로 공유 이름 g
과 h
의 다음 순차적으로 호출 g
하고 h
값이 가리키는 발생합니다 임의의 순서로 p
변경하지. 병렬화 된 경우 읽기 *p
및 할당이 둘 사이에 임의로 인터리브 될 수 있습니다.
g
*p
값 1을 읽고 찾습니다.f
*p
값 1을 읽고 또한 찾습니다.g
2를*p
.f
, 여전히 이전에 읽은 값 1을 사용하면 0을 씁니다*p
.
따라서 병렬화 될 때 동작이 다릅니다.
'Programing' 카테고리의 다른 글
판매 통계는 iTunes Connect에서 얼마나 자주 업데이트됩니까? (0) | 2020.11.09 |
---|---|
HTML5 라이브 스트리밍 (0) | 2020.11.09 |
Timely와 같은 아름답고 세련된 앱을 만드는 방법 (0) | 2020.11.09 |
HTTP Put은 어떻게합니까? (0) | 2020.11.09 |
Chrome / Chromium 및 Safari에서 끌어서 놓기 파일 업로드? (0) | 2020.11.09 |