2012-06-21 4 views
1

/gcc에서 N 개의 스레드를 만듭니다. 각 스레드는 가능한 한 빨리 for (;;) printf(...) ID를 사용하여 씁니다. 나는 전체 프로그램을 usleep을 사용하여 3 초 동안 실행시키고 내 4-core CPU에서 N=4이 약 1,000,000 개의 라인을 생성하고 N=8이 약 4 배를 생성 할 때 CPU에 주목합니다. 4 코어 CPU 8 스레드가 더 나은 성능을 발휘하는 이유는 무엇입니까? CPU에 하이퍼 스레딩이 활성화되어 있지 않습니다.적절한 스레드 수는 무엇입니까

+0

I/O 작업, 하이퍼 스레딩, 많은 작업. –

+0

@MarcoMariani 아니요, 하이퍼 스레딩을 사용할 수 없습니다. – Cartesius00

+0

하지만 차단 I/O를 사용하고 있습니까? peripherials가 작동하고 CPU가 그들을 기다리고있는 동안 스레드가 유휴 상태가됩니다. –

답변

2

I/O 및 CPU 작동이 매우 다릅니다. CPU 집약적 인 계산을 실행하면 N = 코어 수가 최적이됩니다. I/O의 경우 최적의 수를 훨씬 더 높일 수 있습니다.

+0

+1. 그러나 * "I/O의 경우 최적 수는 훨씬 더 높을 수 있습니다."* - 또는 훨씬 낮을 수 있습니다. 실제로 I/O 처리량에 따라 다릅니다. – ArjunShankar

+1

하지만 IO의 스레드 수가 최적의 이유는 무엇입니까? – Ben

+0

I/O 작업이 네트워크 소켓에서 읽기를 차단한다고 가정합니다. 각 작업은 몇 초 동안 차단 될 수 있지만 일단 데이터가 도착하면 처리 속도가 매우 빨라질 수 있습니다. 따라서 머신은 코어를 가지고있는 것보다 훨씬 많은 연결을 처리 할 수 ​​있지만 각 작업이 블로킹하기 때문에 동시에 모든 스레드를 처리하기 위해 많은 스레드가 필요합니다. –

0

4 스레드가있는 경우 각 코어에서 하나의 스레드가 실행되지 않습니다. 2와 8threads도 마찬가지입니다. 멀티 코어의 아이디어는 달성 된 작업을 분리하는 것입니다. 또한 스레드 ID 만 표시하면 가벼운 CPU 작업을 수행 할 수 있습니다. 따라서 CPU 용량을 사용하지 않고 핸들 디스플레이 이벤트 기능을 사용합니다.

+0

"* 각 코어에서 스레드가 실행되지는 않습니다. * "왜 안 되니? 적어도 스레드를 프로세서에 바인딩하는 경우 가능합니다. – Ben

관련 문제