0

컴퓨팅 집약적 알고리즘을 병렬 처리하려는 사람들에게 .NET 4 이상의 작업 병렬 라이브러리를 활용하는 일반적인 패턴을이 문서에서 가리켜 보겠습니다. https://www.microsoft.com/en-us/download/details.aspx?id=19222대용량 데이터 작업 병렬 라이브러리의 초기 설정 패턴

그러나, 하나 개의 패턴은 내가 N에 입력 세트가 DataTable의 100 개 행을 말을 가지고 ... 내가 그 것을 다른 멋진 문서에서 다루지 않습니다 가지고, 합리적으로 일반적인 생각,

있다 M 열의 일부 출력을 계산해야하는 열 각 행은 독립적으로 계산 될 수 있으므로 병렬 처리가 가장 중요합니다.

그러나 계산을 수행하려면 먼저 방대한 데이터 구조를 만들어야합니다. 행을 위해 작성된 후에는 다른 행에 사용하도록 재설정 할 수 있습니다. 따라서 각 행마다 처음부터 다시 작성하고 싶지는 않습니다 ... 재설정하는 것보다 훨씬 오래 걸립니다. 그러나 병렬 계산은 각각의 데이터 구조를 수정하기 때문에 데이터 구조를 공유 할 수 없습니다. 오히려 각자 자신의 데이터 구조가 필요합니다.

알고리즘 적으로, 내가해야 할 일은 먼저 독자적인 대규모 데이터 구조를 구축 할 수있는 각 프로세서 코어에 대한 스레드를 시작하는 것입니다. 그런 다음 계산할 행이 없어 질 때까지 행을 계산하고 재설정하고 다른 행을 계산하고 다시 설정해야합니다.

작업 병렬 라이브러리에는 이러한 프로세스를 관리하는 데 모든 지능이 있지만 ...이 시나리오의 예제를 찾으려면 아직 각 스레드에서 방대한 데이터 빌드, 계산, 재설정, 계산, 재설정 할 때까지 계속합니다.

합리적으로 일반적인 패턴 인 것처럼 보입니다 ... .NET 4 이상의 작업 병렬 라이브러리가 그 패턴을 지원하는 방법에 대한 예제를 알려줄 수 있습니까 ??

+0

일반적인 냄새가 아니라 일반적인 패턴입니다. 같은 구조체를 "정리하고 재사용"해야한다면 잠글 필요가 있습니다. 나쁜 생각. 어쨌든 조립식 구조가 필요한 이유는 무엇입니까? 이점은 무엇입니까? 어느 것이 든 모든 값을 바꾸거나 (그냥 새로운 값을 만들어야 함), 또는 당신은 상수 값에 대해 이야기하고 있습니다. –

+0

구조를 재사용하면 해결할 수 있다고 생각되는 실제 문제는 무엇입니까? 메모리 소비를 줄이려고하십니까? 할당? 할당을 피하는 기술 (예 : 파일의 문자열 분리 대신 정규 표현식 사용)을 사용하거나 버퍼 풀을 사용하여 버퍼를 재사용 할 수 있습니다. –

+0

각 스레드가 해당 기본 구조의 인스턴스를 직접 빌드 할 계획이므로 잠금이 필요하지 않습니다. 세계의 모델이라고 생각하십시오. 그런 다음 각 행에는 그 세계에서 일어나는 일 (입력)이 포함되어 있으며 그 행으로 되돌아가는 결과를 결정하기 위해 거대한 분석을 수행해야합니다. 잠금이 필요하지 않습니다. 문제는 4 개의 코어와 1000 개의 행이 있다면 세계의 기본 모델을 단지 4 번 빌드하고 각 스레드를 정리하고 모델을 250 번 재사용하고 싶습니다. (현재의 순차적 구현은 세계 모델을 한 번 구축하고이를 1000 번 정리하고 재사용합니다.) –

답변

0

I는이 함께 온 가장 좋은 대답은 ... 내가 필요가 있다고 생각 ...이의 결함을 볼 수 있다면 내가 당신이 더 나은 경우 ... 모르거나

을 주시기 바랍니다 Parallel.For (0, Environment.ProcessorCount, ...)를 호출하고 기본 구조를 빌드 한 다음 모든 행이 처리 될 때까지 공유 rowIndex에서 Interlocked.Increment를 수행하여 행 처리를 시작하십시오.

그런 식으로 기본 구조는 각 프로세서마다 최대 한 번 구축 된 다음 재사용되지만 너무 많은 메모리 또는 다른 리소스를 소비하기 시작하면 Parallel.For가 Environment보다 적은 수를 선택할 수 있습니다. 한 번에 ProcessorCount 작업. 참된?

더 좋은 방법이 있습니까?