3

나는 alpha-beta 잘라내기를 추가로 구현 한 고전적인 미니 맥스 문제 해결사를 가지고 있습니다. 우리가 사용할 수있는 스레드 알파 - 베타가 암달의 법칙을 "깨뜨린"것입니까?

  • 실행 N 스레드의 일괄 스레드 당 최소 최대보다 더 많은 노드가 될 때까지

    1. 이 반복 심화를 수행

      나는 다음과 같은 방법으로 알고리즘을 병렬화. 따라서 직렬 검색에서 깊이 2에서 가능한 9 개의 이동을 얻으면 먼저 4 개의 스레드를 시작한 다음 4 개의 스레드를 시작하고 마지막에 1을 ​​시작합니다. 각 스레드는 깊이 2에서 시작하여 자체 매개 변수로 시작합니다.

    4 스레드에 대한 S = T (직렬)/T (병렬)의 속도가 4.77이므로 Amdahl의 법칙을 근본적으로 위반하고 있습니다.

    구현이 어떤 식 으로든 손상되지 않는다고 가정한다면 알파 베타 프 루닝이 여기서 마술을한다고 생각합니까? 여러 검색을 동시에 시작하기 때문에 더 많은 가지 치기가 있으며 일찍? 그것은 내 이론이지만 누군가가 이것을 더 자세히 확인할 수 있다면 좋을 것이다.

    그냥 명확하게 :

    최소 최대를 알파 - 베타 구현은 기본적으로 약간의 최대 깊이까지 전체 트리의 깊이 우선 검색을하고하지 않고. 알파 베타를 사용하면 일부 분기를 잘라내어 어쨌든 더 나쁜 결과가 나오는 것을 제외하고는 동일하게 수행합니다.

    편집 : 코드를 자세히 검토 한 후 프로그램을 "속이고"일부 동작을 따르지 않는 버그가있었습니다. 실제 가속 계수는 3.6입니다. 모든 사람의 시간을 낭비하게되어 죄송합니다. 오늘날 컴퓨팅 분야에서는 혁신이 없습니다. :/

  • +0

    하나의 스레드가 L3 캐시를 스파이크로 만들어 다른 코어가 메모리에보다 쉽게 ​​액세스 할 수있게합니다. –

    답변

    1

    캐시 효과 등이 원인 일 수 있습니다. superlinear speedup이라고합니다. 그것은 일어날 수있다.

    +0

    이것이 실제로 진행되고 있는지 어떻게 알 수 있습니까? 캐시 히트를 프로파일 링하는 방법은 무엇입니까? – cen

    1

    더 많은 스레드를 사용하면 너비 부분 우선 검색을 효과적으로 실행하고 있습니다. 귀하의 문제는 폭 넓은 우선 검색에만 적용됩니다.

    싱글 코어 컴퓨터 일지라도 속도가 향상됩니다.

    이 속도 향상을 위해 스레드가 필요하지 않습니다. 여러 스레드처럼 동작하는 너비 우선 검색을 부분적으로 프로그래밍 할 수 있습니다.

    하면이 목록을 검색 할 상상 : 다음 다음

    • 1 백만 회 0, 1

    • 1, 1 백만 회

    0을 그리고 당신은 즉시 중지 너는 1을 찾는다. 순차적으로 검색하는 경우 1,000,002 개의 요소를 살펴야합니다. 단일 코어에서 두 개의 스레드를 사용하는 경우 검색은 즉시 1을 찾으면 완료됩니다. 1,000,000x 정도의 "초 선형"스피드 업!

    +0

    그러나 알파 베타와 관련이 있습니까? 만약 내가 그걸 꺼내면, 본질적으로 전체 나무를 1과 같은 값을 찾는 것뿐만 아니라 고정 된 최대 깊이까지 검색하고 있습니다. 따라서 ab가 없으면 단일 스레드 CPU는 검색 기법이 사용되거나 원했던 관계없이 동일한 양의 노드를 방문하게됩니다 더 빠를 수는 없어. 설명을 위해 첫 글을 수정했습니다. – cen

    +0

    하지만 스레드의 수는 처음 보는 위치에 영향을 미칩니 까? 아주 간접적으로. – usr

    +0

    사실. 하지만 여기서는 전체 트리를 검색해야한다고 가정 해 봅시다. 이 경우 부분 너비 우선 탐색은 깊이 우선 우선보다 빠르지 않을 것입니다. – cen