난 그냥 다음 코드 (GCC 4.5.1에서) OpenMP를 컴파일하지 않는 것으로 나타났습니다 :OpenMP : 포인터 대상 플러시 방법?
struct job {
unsigned busy_children;
};
job* j = allocateJob(…);
// …
#pragma omp flush(j->busy_children)
컴파일러는 플러시 인수 목록에서 ->
에 대해 불평하고, OpenMP를 따라 사양이 맞다 : flush
은 기본적으로 (한정된) ID 만 허용된다는 식의 "id-expression"목록을 인수로 사용합니다.
포인터가 목록에 있으면
포인터 자체 플러싱 아닌 메모리 블록 포인터가 참조하는 :또한, 규격이 약
flush
놓았 말한다.
물론. 그러나, OpenMP 또한 나를 역 참조 포인터를 허용하지 않기 때문에 나는 기본적으로 pointee (포인터 대상)을 플러시 수 없습니다.
- 그러면 참조는 어떻게됩니까? 사양은 그들에 대해 언급하지는 않지만 다음 사항들이 적합하다는 것을 확신하지 못하고 실제로 pointee를 플러시 할 것입니다.
unsigned& busy_children = j->busy_children;
#pragma omp flush(busy_children)
작동 여부가 보장됩니까?
그렇지 않은 경우, 어떻게 뾰족점을 없앨 수 있습니까?
MSDN에 따르면 "플러시 지시어에 지정된 변수에는 참조 유형이 없어야합니다." 따라서 모든 ** 플랫폼에서 작동하는 것은 보장되지 않습니다. GCC에 대해 알지 못합니다. –
@Kyrill : Ah, f * ck. 그건 그렇고, OpenMP 스펙은 분명히 ** 3.0 ** 2.5도 언급하지 않습니다. 그리고 섹션 번호 매기기는 MSDN에서 다릅니다. –