2014-12-22 5 views
0

Parallel.For를 사용하여 루프를 다시 구현하는 방법은 무엇입니까?Parallel.For를 사용하여 루프를 다시 구현하십시오.

for (int i = 0; i < data.Length; ++i) 
    { 
     int cluster = clustering[i]; 
     for (int j = 0; j < data[i].Length; ++j) 
      means[cluster][j] += data[i][j]; // accumulate sum 
    } 

성능 향상과 속도 향상이 목표입니다.

+0

우리는 여기에서 당신의 작업을 철저히하지 않습니다. 이미 시도한 것을 우리에게 보여줘야합니다. – cost

+0

Google 검색을 수행하고 Parallel.ForEach 사용법을 배우십시오. – MethodMan

+0

배열의 크기는 얼마나됩니까? 병렬 처리가 정말로 필요합니까? (* 추가 *는 가장 싼 지침 중 하나입니다.) –

답변

3

대부분 외부 루프를 바꿀 수 있습니다. 그러나

Parallel.For(0, data.Length, i => 
{ 
    int cluster = clustering[i]; 
    for (int j = 0; j < data[i].Length; ++j) 
     Interlocked.Add(ref means[cluster][j], data[i][j]); 
}); 

이 더 빨리 실행되지 않을 수 있습니다, 실제로 상당히 느리게 실행될 수 있습니다 쉽게 false sharing을 소개 할 수와 같은 : 여러 스레드에서 값을 설정하는 그러나, 당신은 설정으로 돌볼 필요 모든 것이 동일한 배열에서 읽고 쓰고 있기 때문입니다.

+0

감사합니다. Interlocked.Add 메서드 오버로드는 double 형식을 지원하지 않습니다. "data"라는 이름의 배열이 double이기 때문입니다. 이 경우 관련 게시물을 읽지 만 제안 된 루프를 정확하게 다시 작성하는 방법은 명확하지 않습니다. – Araz

+0

이 루프는 병렬 처리를 사용하여 속도를 높이는 데 관심이 있으므로 알고리즘의 병목 현상 중 하나입니다. 거짓 공유 및 캐싱을 고려한 더 나은 솔루션은 무엇입니까? – Araz

+0

@Araz interlocked.add를 사용하지 않고, 다른 형태의 동기화 (잠재적으로 잠금 사용)를 수행해야합니다. 알고리즘을보다 쉽게 ​​병렬화 할 수 있도록 알고리즘의 설계를 다시 생각해 볼 가치가 있습니다. –