2010-11-21 2 views
2

ID 기술 3과 같은 기존 엔진에서 상당한 개선을 달성 할 수있는 방법을 생각할 수 있습니까? 오디오 서브 시스템에서이 작업을 시도함으로써 속도보다 속도가 느려지는 것을 알 수있었습니다. 나는 루프에서 계산되고 코어와 거의 통신하지 않는 데이터의 큰 덩어리가 필요할 것이라고 생각한다.OpenMP를 사용하는 ioquake3과 같은 기존의 단일 스레드 게임 엔진에서 어떤 종류의 최적화를 수행 할 수 있습니까?

답변

2

ioquake3 또는 id tech 3에 대해서는 아무것도 알지 못하지만 OpenMP에 대해서는 약간의 지식이 있으므로 즉시 질문을 해 드리겠습니다.

OpenMP는 처음에는 공유 메모리에 액세스 할 수있는 프로세서 전반에 걸쳐 대규모 어레이에 루프 반복을 배포하기 위해 개발되었습니다. 이것은 과학 및 엔지니어링 프로그램의 많은 부분에서 요구 사항이므로 OpenMP가 이러한 프로그램에 많이 사용된다는 것은 놀랄 일이 아닙니다.

최근에는 OpenMP 3.0을 사용하여 응용 프로그램 범위를 확장하는 디렉터/작업자 작업 분해를위한 우수한 기능을 제공합니다. 필자는 이러한 새로운 기능에 대한 많은 경험이 없지만 유망 해 보입니다.

그럼 당신의 질문은 계산 핵심이 OpenMP가 지원하는 계산 모델에 얼마나 잘 맞습니까?

+0

openMP와 같은 사운드는 여러 프로세스에서 더 많이 발생하지만 빠른 게임에서는 동일한 프로세스에서 여러 스레드가 필요할 것입니다. –

+0

@Mark Storer - 실제로 OpenMP는 대부분의 o/s가 메모리를 공유하는 별도의 프로세스를 막기 위해 매우 힘들게 작업하기 때문에 거의 항상 스레드로 구현됩니다. 이것은 OpenMP의 자격을 부여하는 계산에 존재하는 병렬 처리 유형입니다. –

0

OpenMP는 루프의 다른 요소에 의존하지 않는 데이터에서 작업 할 때 매우 효과적입니다. 예를 들어 :

std::vector<int> big_vector(1000, 0); 
for (int i = 0; i < big_vector.size(); ++i) 
{ 
    big_vector[i] = i; 
} 

는 OpenMP를 잘 최적화,하지만

std::vector<int> big_vector(1000, 0); 
for (int i = 1; i < big_vector.size(); ++i) 
{ 
    big_vector[i] = i * (big_vector[i - 1] + i); 
} 

않을 것 것입니다.

OpenMP 설정을 사용하여 결과를 향상시킬 수 있는지 살펴볼 수도 있습니다. 자세한 내용은 http://www.amazon.com/Multi-Threaded-Engine-Design-Jonathan-Harbour/dp/1435454170에 OpenMP에 대한 전체 장 (boost, posix-threads 및 Windows Threads)이 있습니다.

관련 문제