std:for_eachConcurrency::parallel_for_each 중에 어떤것이 더 빠른 속도를 낼 것인가?

가정 1. CPU Core가 늘어남에 따라 Single Thread보다는 Multi Thread를 활용하여 CPU 자원을 최대한 활용한다.

가정 2. 컨테이너를 읽기 전용으로 접근할 경우 Lock 객체를 사용하지 않아도 된다.
          (Race Condition, 스레드간 공유 자원 접근 문제)

가정 3. Thread 갯수가 과도하게 늘어나서 빈번하게 Context Switching이 발생할 경우 속도 저하가 발생한다.
           (Concurrency::parallel_for_each는 Thread 갯수를 스스로 조절한다.)

가정 4. 암달의 법칙(Amdahl's law)으로 직렬화된 작업을 병렬화 작업으로 바꾸더라도 속도 향상에는 한계가 있을 것이다.

위 4가지 가정으로 봤을때, 컨테이너를 이터레이팅 할때 많은 도움은 안되더라도 약간의 속도 향상을 기대하였다.

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale( LC_ALL, "Korean" );

	std::vector< int > vecContainer;

	for( int i = 0; i < 10000; ++i )
	{
		vecContainer.push_back( i );
	}

	class fntorPrintElem : public std::unary_function< int, void >
	{
	public:
		explicit fntorPrintElem() {};
		
		void operator() ( const int& elem ) const
		{
			std::wcout << "";
		}
	};

	// std::for_each 속도 체크 코드 생략...
	std::for_each( vecContainer.begin(), vecContainer.end(), fntorPrintElem() );
	
	// Concurrency::parallel_for_each 속도 체크 코드 생략...
	Concurrency::parallel_for_each( vecContainer.begin(), vecContainer.end(), fntorPrintElem() );
	
	return 0;
}
사용자 삽입 이미지




그러나 위 4가지 가정에서 예측한 것과 다른 값이 도출되었다.
std::for_each 수행 시간 : 0.004950
Concurrency::parallel_for_each 수행시간 : 0.005819

parallel_for_each를 사용하면, std::for_each를 사용했을때 보다 오히려 성능이 떨어진다.
일반적인 상황에서 Concurrency::parallel_for_each를 사용했을 경우 성능 향상을 보장 받을 수 없다.

그렇다면 parallel_for_each가 더 빠르게 하려면 무엇을 해야 할까?

functor에서 Sleep(1)을 넣어서 측정한 결과는 다음과 같다.
사용자 삽입 이미지





std::for_each 수행 시간 : 10.019599
Concurrency::parallel_for_each 수행시간 : 3.753167

측정 결과 parallel_for_eachstd::for_each보다 상대적으로 약 2.6배 빠르지만,
std::for_each는 2504배 느려지고, parallel_for_each는 750배 느려졌다.

일반적인 컨테이너를 이터레이팅 하는 상황에서 Concurrency::parallel_for_each대체하기만 하면,
속도 향상이 있을 것이라는 기대는 깨졌지만,

네트워크 I/O와 같은 비동기 대기가 발생하는 상황에서
코딩 난이도가 높지 않은 parallel_for_each를 활용하면, 속도 향상에 도움이 될 것으로 예측한다.
2011/07/28 16:45 2011/07/28 16:45

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요