과학 컴퓨팅에서 병렬화로 속도를 낼 수없는 유명한 문제 / 알고리즘이 있습니까? CUDA에 관한 책을 읽는 동안 대부분의 일이 가능할 것 같습니다.
과학 컴퓨팅에서 병렬화로 속도를 낼 수없는 유명한 문제 / 알고리즘이 있습니까? CUDA에 관한 책을 읽는 동안 대부분의 일이 가능할 것 같습니다.
답변:
중심 문제는 총 계산량 ( T) 에 대한 임계 경로 ( )의 길이이다 . 경우 C는 비례 T 최선을 일정한 속도 업, 다음 병렬 제공. 경우 C는 보다 작은 점근 T 문제 크기가 증가함에 따라 더 많은 병렬 처리를위한 공간이 존재한다. 입력 크기 N 에서 T 가 다항식 인 알고리즘의 경우 로그 시간보다 적은 양으로 유용한 양을 계산할 수 없기 때문에 가장 좋은 경우는 C ~ log T 입니다.
NC 복잡도 클래스 (polylogarithmic시기, IE) 병렬로 효과적으로 해결 될 수있는 이러한 문제를 특성화. 인지는 알려져 있지 않지만, 거짓으로 널리 가정되어있다. 이것이 사실이라면, P- 완료 는 "내재적으로 순차적 인"문제를 특징 짓고 병렬 처리에 의해 크게 발전 될 수 없습니다.
이것에 대한 이론적 측면을 제공하기 위해, 는 O ( n k ) 병렬 프로세서 를 갖는 시스템 에서 시간으로 해결할 수있는 복잡성 클래스로 정의된다 . 그것은 아직도 알 수없는 여부 P = N C (대부분의 사람들은 그렇지 않은 생각하지만) P는 다항식 시간에 풀 수있는 문제의 집합입니다. 병렬화하는 "가장 어려운"문제는 P의 모든 문제 가 다음을 통해 P 완료 문제 로 감소 될 수 있다는 점 에서 P 완료 문제라고합니다. 감소. 단일 P- 완전 문제가 N C 에 있음을 보여 주면 P = N C 임을 증명할 수 있습니다(위에서 언급 한 것처럼 아마도 거짓 임).
따라서 완료된 모든 문제 는 직관적으로 병렬화하기가 어렵습니다 (큰 속도 향상이 여전히 가능하더라도). P 우리는 심지어 아주 좋은 일정 인자 속도 향상을 갖고 있지 않은 - 완전한 문제는 선형 계획법 (참조입니다 이 또는 교환에 댓글을 추가).
암달의 법칙을 시작하여 시작하십시오 . 기본적으로 많은 일련의 단계가있는 것은 병렬 처리에서 크게 도움이되지 않습니다. 몇 가지 예에는 구문 분석, 정규식 및 가장 높은 비율 압축이 포함됩니다.
그 외에도 중요한 문제는 종종 메모리 대역폭의 병목 현상입니다. 특히 대부분의 GPU에서 이론적 인 플롭은 ALU에 도달 할 수있는 부동 소수점 수를 훨씬 능가합니다. 산술 강도 (플롭 / 캐시 미스)가 낮은 알고리즘은 RAM을 기다리는 데 많은 시간이 소요됩니다.
마지막으로, 코드 조각에 분기가 필요한 경우에는 ALU의 논리 수가 일반적으로 많기 때문에 좋은 성능을 얻지 못할 수 있습니다.
결론적으로 GPU에서 속도 향상을 얻기 어려운 실제 예제는 정수 배열에서 0의 수를 세는 것입니다. 하나) 0을 찾은 경우 작업 당 하나 이상의 메모리 페치를 만듭니다.
분기 문제가없는 예는 다른 벡터의 누적 합인 벡터를 계산하는 것입니다. ([1,2,1]-> [1,3,4])
이것이 "유명한"것으로 여겨지는지는 모르겠지만 병렬 컴퓨팅이 도움이되지 않는 많은 문제가 있습니다.
아이코 날 방정식을 풀기위한 (고명 한) 빠른 행진 방법은 병렬화로 속도를 낼 수 없습니다. 병렬화에 더 적합한 아이코 날 방정식을 풀기위한 다른 방법 (예 : 빠른 스위핑 방법)이 있지만 여기서도 (병렬) 속도 향상의 가능성은 제한적입니다.
Eikonal 방정식의 문제점은 정보의 흐름이 솔루션 자체에 달려 있다는 것입니다. 느슨하게 말해서 정보는 특성 (광학의 광선)을 따라 흐르지 만 특성은 솔루션 자체에 따라 다릅니다. 그리고 이산 된 아이코 날 방정식에 대한 정보의 흐름은 더 나빠서 병렬 속도 향상이 필요한 경우 추가 근사치 (고속 스위핑 방법에 암시 적으로 존재 함)가 필요합니다.
병렬화의 어려움을 보려면 Sethian 웹 페이지 의 예제와 같이 멋진 미로를 상상해보십시오 . 미로를 통한 최단 경로상의 세포의 수는 (아마도) 상응하는 문제를 해결하는 임의의 (병렬) 알고리즘의 최소 단계 / 반복의 수에 대한 하한이다.
하한은 증명하기가 어렵고 종종 알고리즘에서 사용되는 연산에 대한 합리적인 가정이 필요하기 때문에 "(아마도)는"라고 쓴다.
실제로 병렬화하기 어려운 또 다른 종류의 문제는 반올림 오류에 민감한 문제이며, 여기서 직렬화에 의해 수치 안정성이 달성됩니다.
예를 들어 Gram–Schmidt 프로세스 및 일련의 수정을 고려하십시오 . 이 알고리즘은 벡터와 함께 작동하므로 병렬 벡터 연산을 사용할 수 있지만 확장 성이 떨어집니다. 벡터 수가 많고 벡터 크기가 작은 경우 병렬 클래식 Gram-Schmidt를 사용하고 직교 화하는 것이 단일 수정 된 Gram–Schmidt보다 안정적이고 빠를 수 있지만 몇 배 더 많은 작업이 필요합니다.