2014-08-28 5 views
-2

내 코드는 다음과 같다 : 밀도가 높은 IO 작업의 Openmp, 속도 향상 방법은 무엇입니까?

for (int i = 0; i < N; i++) 
{ 
    /*Reading for big data*/ 

    HeavyProcess(); 

    /*Writing for big data*/ 
} 

내가이 시도 :

#pragma omp parallel ordered schedule(dynamic) 
for (int i = 0; i < N; i++) 
{ 
#pragma omp ordered 
/*Reading for big data*/ 

    HeavyProcess(); 
#pragma omp ordered 
    /*Writing for big data*/ 
} 

을하지만 매우 느리게, CPU 사용은 하나 개의 코어가 작동 보이는 것으로 판명.

만약 내가 간단한 사용

#pragma omp parallel for 

내가 훨씬 더 높은 CPU 사용량을 얻을 수 있지만, 100 %.

의견이 있습니까? 매우 감사합니다! Zboson의 코멘트 @에 확장

+4

의미있는 도움/조언을 제공하려면 더 많은 정보가 필요하다고 생각합니다. –

+0

openmp에 대해 많이 알지는 못하지만 100 % CPU 사용량이 매우 드문 경우, 보통 프로세서가 RAM을 기다리는 데 많은 시간을 낭비하므로 더 많은 데이터가 필요없는 알고리즘을 작성하지 않으면 프로세서의 레지스터에 맞으면 메모리를 기다릴 것입니다. – cdkrot

+0

한 스레드로 버퍼에 데이터를 읽은 다음 병렬로 (순서대로 정렬하지 않고) 버퍼에서 작동 한 다음 한 스레드로 출력 버퍼를 씁니다. –

답변

2

, 당신은 처리 파이프 라인을 설정해야합니다 :

+---------+------------+---------+ 
| Reading | Heavy  | Writing | 
| data | Processing | Data | 
+---------+------------+---------+ 

하나의 스레드를 시작합니다 및 데이터를 읽습니다.
데이터가 처리 데이터로 전달됩니다.
읽기 스레드가 더 많은 데이터를 읽습니다.

무거운 처리가 완료되고 데이터 쓰기 프로세스로 데이터가 전달됩니다.
읽기 데이터 프로세스는 데이터를 대량 처리 프로세스로 전달합니다.
읽기 데이터 프로세스는 더 많은 데이터를 읽습니다.

"이중 버퍼링"개념을 연구하십시오. 이 경우 적어도 세 개의 버퍼가 필요할 수 있습니다. 버퍼에 대한 포인터는 각 프로세스에 전달됩니다.

는 I/O를위한 하드웨어 가속을 활용할 :

  1. 판독 처리는 원시 데이터 버퍼에 판독한다.
  2. 읽기 프로세스는 무 처리 프로세스를 위해 원시 데이터를 내부 형식 으로 변환합니다.
  3. 데이터 쓰기 프로세스는 원시 데이터를 형식의 데이터 버퍼에 작성해야합니다.
  4. 쓰기 데이터 프로세스는 형식화 된 버퍼를 1 I/O 조작으로 작성해야합니다.

더 똑똑한 플랫폼에서는 OS가 직접 메모리 액세스 (DMA) 컨트롤러와 같은 장치를 사용하여 I/O에서 직접 메모리로 읽을 수 있습니다. 이렇게하면 프로세스가 더 많은 시간을 처리 할 수 ​​있습니다. 쓰기와 비슷합니다. DMA 컨트롤러는 포맷 된 데이터 버퍼의 데이터를 프로세서와 독립적으로 출력 장치로 보낼 수 있습니다.

또 다른 제안은 주 프로세서가 I/O를 처리하고 그래픽 컨트롤러 보드에있는 프로세서와 같이 다른 프로세서가 중 처리를 수행하도록하는 것입니다.

+0

그래서 for 루프 레벨에서 병렬 처리하면 안됩니다? 무거운 처리 단위 만 병렬 처리해야하고 for 루프는 하나씩 실행됩니다. 좀 더 자세한 제안을 해주시겠습니까? 그리고 내 코드는 GPU가없는 32 코어 서버에서 실행됩니다. 감사! – user2727676

+0

@ user2727676, 나는 'Heavy Processing'이 대신에 병렬 처리 될 수있는 for 루프를 가지고 있다고 가정합니다. 그러나 당신이 제공 한 아주 작은 코드 이후로 말하기는 불가능합니다. –

+0

@ user2727676, 왜 루프 용으로 3 개의 분리 된 것이 없습니까? 하나는 읽기 용이고, 하나는 무거운 처리 용이고 다른 하나는 쓰기 용입니다. 그런 다음 무거운 처리 공간 만 병렬 처리하십시오. –