선택 최소 중에서 최소 사용을 병행합니다.ForEach
-
28-09-2020 - |
문제
나는 새로운 C# Parallel.ForEach
, 다.순서는 일반적이다.내가 원하는 병렬화하는 검색을 포함한 수천명의 위치입니다.을 위해 각 위치,내가 계산한 원리합니다.는 계산이 나는 원하는 퍼지는 다른 코어 있습니다.나의 질문은 어떻게 이렇게 만약 내가 나 실 지역 변수,에서 이 MSDN TPL 예?에 대한 결과,보았 Interlocked
, 고,해당 옵션 Add
, CompareExchange
, Decrement
, Exchange
, Increment
고 Read
, 하지만 난 그냥의 추가,증가,감소시키거나 대한 테스트가 있습니다.나는 개체를 통해 여러 스레드를 병렬로 실행되는 최단 전체 거리입니다.내 창자가 말이 쉬워야 한다는 내가 있어야 만들 수 있는 몇 가지 작은 개체는 래핑 Location
거리지만,나는 어떻게 캡쳐 최고의 대답에서 각 스레드 다음 선택하는 가장 짧은 거리 그 중?여기에는 비 병렬 버전:
Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
double closest = double.MaxValue;
Location closestLoc = null;
foreach (Location aLoc in allLocations)
{
if (aLoc != myLocation)
{
double d = greatCircle(myLocation, aLoc);
if (d < closest)
{
closest = d;
closestLoc = aLoc;
}
}
}
return closestLoc;
}
봤 가 블로그 포스팅 는 듯 제공하는 좋은 조언을지 궁금해했다면 그것이 최선의 조언입니다.나는 저자는 반복을 통해 배열과 경이 없는 경우에는 더 많은 기능적인 방법을 찾았습니다.에 기능적인 세계가 사용하는 것 map
, lambda
고 min
.
해결책
가장 쉬운 옵션이 여기 것을 전환하 PLINQ:
Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
return allLocations
.AsParallel()
.Min(location => greatCircle(myLocation, location));
}
그는 말했다,이것은 기본적으로만 집으로 병렬 구조.당신은 몇 가지 옵션을 선택할 수 있습니다려는 경우 지팡이를 병행 클래스입니다.하는 것도 한 가지 방법이 될 수 있기에 내 자신을 사용하여 블록 잠글 수 있습니다.이 없으로,그 상처 당신의 전반적인 성능을 개선합니다.
더 나은 옵션을 사용하는 것입 병행합니다.ForEach 는 방법을 제공을 위한 현지 상태가 됩니다.에 당신을 다시 이 같:
Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
double closest = double.MaxValue;
Location closestLoc = null;
object sync = new object();
Parallel.ForEach<Location, Tuple<double,Location>(
allLocations,
() => new Tuple(double.MaxValue, null),
(location, loopState, localState) =>
{
double d = greatCircle(myLocation, aLoc);
if (d < localState.Item1)
return new Tuple(d, aLoc);
else
return localState;
},
localState =>
{
lock(sync)
{
if (localState.Item1 < closest)
{
closest = localState.Item1;
closestLoc = localState.Item2;
}
}
}
);
return closestLoc;
}
내가 사용하여 커버 현지 상태에 대한 집계에 대한 세부 사항 나 블로그.이것은 기본적으로 변화 작업을 하는 잠금 작업을 당신의 하나 잠금 당 처리 요소,그래서 당신은 훨씬 더 높은 처리량보다는 순진한 잠그는 솔루션입니다.