보드 게임을하는 아주 오래되고 매우 큰, 완전히 작동하는 C 프로그램이 있습니다. 멀티 코어 프로세서를 활용할 수 있도록 여러 스레드에서 작동하도록 변환하고 싶습니다. 이전 프로그램에는 board []라고하는 전역 UBYTE 배열이 있습니다. 보드 []의 내용을 조작하는 많은 (매우 최적화 된, 매우 중요한) 기능이 있습니다.오래된 C 코드를 쓰레드로 변환하기
1 단계는 싱글 보드 []의 많은 조작을 수행하는 단일 스레드 에 작업의 큰 숫자를 수행 : 지금 다음과 같이 처리 작업을 만들고 싶어. 이들은 여러 코어에서 수행하기에는 너무 복잡합니다.
2 단계 농장 밖으로 "보드는 []"각 스레드 스레드의 컬렉션에와있는 자신의 자신의 개인 "보드 []" 's의 그들의 별도의 조작을하고 시간을 보낼의 여러 사본 .
단계 3. 스레드가 작업을 끝내고 스레드가 스레드에 대한 답을 반환합니다.
인수로는 32 개의 하위 스레드가 있다고 가정합니다.
이제는 하나의 글로벌 보드 []와 sub_board [32] []와 같은 다른 이름을 가진 32 개의 서브 보드를 만든 다음 새 보드에서 작동하는 새로운 보드 조작 함수 모음을 작성하십시오. 2 차원 sub_board [] [],하지만 이것은 게임 보드에 대한 모든 액세스에 대해 추가 곱셈과 덧셈이 필요하기 때문에 내 최적화를 망칠 것입니다. 또한 오래된 보드 조작 함수의 새로운 버전은 약간 복잡 할 것입니다.
지금까지는 C++ 프로그래머가 아니었지만 (가능한 한 빨리 배우는 중입니다.) 누군가 C++와 관련된 다음 트릭을 제안했습니다 (모든 세부 사항이 정확하지는 않습니다.) : 나는 기존 이사회를 그대로 둔다. 기존 보드 조작 기능을 그대로 둡니다. 보드 (board) []와 보드 조작 함수의 새로운 세트를 포함하는 새로운 클래스 (thread_type이라고 부른다)를 만든다. 이런 식으로 뭔가 :
class thread_type
{
UBYTE board[]; // boards for slave threads to work with
void board_manipulation_A(void);
void board_manipulation_B(void);
}
보드 조작 함수는 "thread_type ::"는 시작에 선언하는 것 외에는 기존의 것들 (그래서 잘라 붙여 넣을 수 있습니다)와 동일하다. 그런 다음에 주() 내가 가진 :
class thread_type slave[32];
가 지금은 기본 스레드에서 모든 내 예전의 코드로 하나의 세계 보드 []를 조작 할 수 있습니다. 그럼 난 .board [] 다음 32 개 스레드의 각 내부 지금
For (i = 0; i < 32;i++)
{
// there will have to be some extra thread/mutex
// related code around here but I'm not showing it for simplicity
slave[n].do_your_stuff();
}
가 [N] 슬레이브 메인 보드 []를 복사 할 수 있습니다, 각각은 그들의 자신의 다른 "보드 []"에 작업 할 코드는 이전의 원본 (완전히 디버깅되고 최적화 된) 코드와 거의 동일합니다. #define 트릭을 수행하여 이전 코드를 자르거나 지나치는 것을 방지 할 수도 있습니다.함수 선언이
void THREAD_OR_BASE board_manipulation_A(void);
처럼 작성하고 내가 언제 내가 만드는 것이 매우 확신 할 수
#define THREAD_OR_BASE thread_type::
이 방법을 한 번
#define THREAD_OR_BASE // zilch
과 한 번이를 통해 실행 한 board_manipulation_A()에 대한 수정은 기본 스레드 버전과 하위 스레드 버전 모두에 나타납니다.
내 질문은 다음과 같습니다. A) 모두 작동합니까? B) 몇 가지 중요한 단계를 놓쳤습니까? C) 나는 더 간단한 방법으로 같은 것을 얻을 수 있었습니까?
편집 : 대신 32 개 스레드, 나는 당신이 같은 일 다시 스레드 결과 보드를 병합 할 필요가없는 경우
오래된 게임이라면 왜 모든 것을 최적화해야합니까? 너의 (잘만되면 그렇게 오래되지 않은) 기계에서 잘 돌아 가야하지 않을까? –
게임은 낡고 코드는 오래되었지만 지속적으로 업데이트되고 새로운 라이벌과 경쟁해야합니다. 속도가 중요합니다. – Mick
C 코드로 작업하는 경우 왜이 태그가 C++입니까? – jalf