평론.Net 병렬 계산의 데이터 병행

첫 번 째 컴퓨터 가 출시 된 후부 터 지금까지 컴퓨터 하드웨어 기술 은 이미 매우 큰 발전 을 이 루 었 다.지금 개인 적 으로 사용 하 는 PC 든 회사 에서 사용 하 는 서버 든쌍 핵,사 핵,8 핵 CPU 는 이미 매우 흔 하 다.이렇게 하면 우 리 는 우리 프로그램 을 여러 컴퓨터 CPU 에 나 누 어 계산 할 수 있 습 니 다.과거 에 병행 화 는 스 레 드 의 저급 조작 이 필요 하고 난이도 가 매우 높 았 습 니 다.net 4.0 에서 병행 화 에 대한 지원 을 강화 하여 이 모든 것 을 매우 간단 하 게 만 들 었 습 니 다.이번 에는 다음 과 같은 몇 가지 측면 에서.NET 병행 에 대해 말씀 드 리 겠 습 니 다.
1.      데이터 병렬 2.      작업 병행 3.      병렬 Linq 4.      미 션 공장 5.      주의 사항    
  이번 에는 주로 여러분 에 게 데이터 병행 과 쓸데없는 말 을 해 드 리 겠 습 니 다.다음은 시작 하 겠 습 니 다.
   데이터 병렬 이란 원래 집합 이나 배열 의 데 이 터 를 구분 한 후에 여러 개의 CPU 나 여러 개의 스 레 드 에 할당 하여 같은 작업 을 수행 하 는 것 을 말 합 니 다.net 에 있 는 System.Threading.Tasks 는 데이터 병렬 지원 류 를 제공 합 니 다.Parallel.For,Parallel.Foreach 는 우리 가 자주 사용 하 는 for 와 foreach 와 매우 비슷 합 니 다.스 레 드 대기 열 을 만 들 지 않 아 도 됩 니 다.기본 적 인 순환 에서 너 는 자 물 쇠 를 사용 할 필요 가 없다.이.net 들 이 당신 을 도와 처리 할 것 입 니 다.당신 은 당신 의 업무 에 만 관심 을 가 져 야 합 니 다.  그러면 Parallel.For 와 Parallel.Foreach 를 어떻게 사용 하 는 지 살 펴 보 겠 습 니 다.
•     Parallel.간단 한 사용

   Parallel.For(0, 100, i => {
                dosameting()
            });
위의 예 는 우리 가 자주 사용 하 는 for 순환 의 그림자 와 같 습 니까?Parallel.For 의 세 번 째 매개 변수 Action형식의 의뢰 는 이 의뢰 의 매개 변수 가 0 개 든 몇 개 든 그의 반환 식 은 void 입 니 다.그러면 Parallel.For 의 반환 값 을 어떻게 얻 을 수 있 습 니까?다음 예 는 스 레 드 로 컬 변 수 를 사용 하여 for 순환 으로 만 든 모든 단독 작업 의 상 태 를 저장 하고 검색 하 는 방법 을 보 여 줍 니 다.  스 레 드 로 컬 데 이 터 를 사용 하면 대량의 접근 을 공유 상태 로 동기 화 하 는 비용 을 피 할 수 있 습 니 다.  작업 의 모든 교체 가 완료 되 기 전에 모든 교체 에 있 는 공유 자원 을 기록 하 는 것 이 아니 라 계산 하고 저장 할 것 입 니 다.  그리고 최종 결 과 를 공유 자원 에 한꺼번에 기록 하거나 다른 방법 으로 전달 할 수 있 습 니 다.
•list를 구 합 니 다.여기 서 List 의 길 이 를 listLength 라 고 가정 합 니 다

   Parallel.For<long>(0, listLength, () => 0, (j, loop, subsum) =>
            {
                subsum += lista[j];
                return subsum;

            }, (x) => Interlocked.Add(ref sum, x));

•현실 에서 도 순환 을 취소 해 야 하 는 경우 가 많다.예 를 들 어 당신 은 대열 에서 숫자 를 찾 습 니 다.그럼 Parallel.For 순환 을 어떻게 종료 합 니까?그 렇 죠?for 와 foreach 처럼 Break 키 워드 를 사용 하면 됩 니 다.답 은 부정 적 입 니 다.이것 은 break 구조 가 순환 에 효과 가 있 기 때문에 병행 순환 은 사실 하나의 방법 이지 순환 을 어떻게 취소 해 야 하 는 것 이 아니다.아래 의 예 를 보십시오.
•간단 한 Parallel.ForEach 순환     Parallel.Foreach 순환 작업 방식 은 Parallel.For 순환 과 유사 합 니 다.시스템 환경 에 따라 원본 집합 을 구분 하고 여러 스 레 드 에서 작업 을 계획 합 니 다.  시스템 의 프로세서 가 많 을 수록 병렬 방법의 운행 속도 가 빠르다.  일부 소스 집합 에 대해 서 는 순서 순환 이 빠 를 수 있 으 며,구체 적 으로 소스 의 크기 와 실행 중인 작업 유형 에 달 려 있다.

Parallel.For<long>(0, listLength, () => 0, (j, loop, subsum) =>
            {
                if (subsum > 20000)
                {
                    loop.Break();
                }

                subsum += lista[j];
                return subsum;

            }, (x) => Interlocked.Add(ref sum, x));

 여러분 들 이 이곳 에서 foreach 의 그림 자 를 보 셨 는 지 모 르 겠 습 니 다.사실 위의 예 에서 Foreach 방법의 마지막 입력 매개 변 수 는 Action의뢰 입 니 다.모든 순환 이 완료 되면 방법 은 이 의뢰 를 호출 합 니 다.이곳 은 앞의 Parallel.For 와 같 습 니 다.그러면 우 리 는 어떻게 반환 치 를 얻 을 것 인가?위의 For 와 매우 비슷 하 다.나 는 여전히 위의 배열 로 화 해 를 구 하 는 것 을 예 로 들 었 다.

   Parallel.ForEach(lista, i => { dosameting(); });
•Parallel.For 와 for 성능 테스트 비교
관련 코드 를 첨부 하여 여러분 께 참고 하도록 하 겠 습 니 다.

Parallel.ForEach<int, long>(lista, () => 0, (j, loop, subsum) =>
       {
           if (subsum > 20000)
           {
               loop.Break();
           }

           subsum += lista[j];
           return subsum;

       }, (x) => Interlocked.Add(ref sum, x));

좋은 웹페이지 즐겨찾기