[완료]멀티코어 멀티스레딩에 관한 문의...

koreteck의 이미지

드디어 즐거운 금요일(?)입니다.

여건상 월,화,수,목,금,금,금 이신 분들도 많으실 것으로 생각합니다. ㅎㅎ

각설하고..

멀티스레드와 관련하여 이미지 보정 최적화 작업을 진행중입니다.

하나의 이미지를 각 픽셀별로 보정을 하는 작업인데요, 단순 반복 작업이라

속도를 높이고 싶어 pthread를 사용하고 있습니다.(SMP가 지원되는 커널상에서) Thread 수는 인자로 동적으로 정하도록 하였구요.

그런데 신기한 것이 스레드 수를 늘려도 각 CPU들이 공평하게 작업을 나누어 가져버리더군요.

예를 들어, 10%의 작업량을 먹었다면 두 개의 CPU가 5% : 5%씩 작업을 하더라구요.

프로세스의 우선순위도 조정도 해보고 동적으로(필요할 때마다) 스레드를 생성도 해보고,

미리 스레드를 생성한 후에 데이터를 던져주는 폴링방식으로도 해보았는데 마찬가지네요.

당연히 메모리는 각 스레드마다 따로 할당하였습니다.

공유메모리1 => 스레드1
공유메모리2 => 스레드2

공유메모리는 구조체로 묶여 있습니다.

작업은 단순히 메모리 상의 내용을 덧셈, 곱셈 작업을 진행합니다.

이렇게 공평하게 작업하지 말고, 10% : 10%씩 20%로 늘렸으면 합니다.

경험이 미비하여 멀티스레딩쪽 경험이 있으신분은 조언 및 비평 부탁드리겠습니다.

짐작하기로는 I/O접근성 때문에 이런현상이 일어나는 건 아닌지 걱정되네요.

그리고 이부분이 테스트가 완료되면 OpenMP 쪽도 프로토타이핑을 해볼까 생각중입니다.

그러니까 OpenMP와 관련해서는 패스하는 것이 어떨까요?

그럼 좋은 하루들 되세요.

mach의 이미지

<span>이렇게 공평하게 작업하지 말고, 10% : 10%씩 20%로 늘렸으면 합니다.</span>

10:10 <== 이것 역시 공평(?)한 것 아닌가요?

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

ifree의 이미지

단일 쓰레드에서 10% 점유율이면 거의 놀고 있는 거 아닌가요?
다른 요인으로 지체되고 있다면 쓰레드를 늘린다고 빨라지진 않을 것 같습니다.

픽셀을 일일이 그래픽 하드웨어에서 받아 작업하신 건 아니시겠죠?

koreteck의 이미지

네 파일에서 읽은 후에 메모리상에서 작업하고 있습니다.

현재 파일에서 읽을 때, 처음부터 여러 메모리 포인터로 나누어서 읽고 있습니다.

공유메모리 리스크를 최대한 없애보려구, 1/4읽어서 하나의 메모리에 넣고, 또 1/4 읽어서 또다른 메모리에 넣는 방식을 사용하고 있습니다.

koreteck의 이미지

저도 지금 그것을 의심하고 있습니다. 현재 코드상으로는 크게 문제가 없다는 생각이 듭니다.

이미지 처리가 너무 빨리 끝나다 보니, CPU 활용도가 올라가기 전에 처리가 완료되는 것은 아닐까 하는 생각이 들었습니다.

그래서 지금 처리속도가 더 오래걸리는 부분을 같은 구조로 만들어보고 있습니다.

다시 한번 확인 후, 결과 올릴게요.

감사합니다.

koreteck의 이미지

그런데 작업하다가 문득 다시 이런 생각이 드네요.

CPU 사용률을 측정할 때, 보통 CPU 사용률이 단계적으로 올라갑니다. 10-> 30-> .... -> 100

그런데 실제 이렇게 CPU 사용률이 천천히 올라가는건지, 아니면 통계 데이터라서 이렇게 올라가는건지 궁금하네요.

실제 이렇게 사용률이 오른다면, 제가 위에서 가정했던 것이 맞는 것이 되는거죠. ^^;;;;;

만약 통계 데이터라서 천천히 사용률이 오르는 것 처럼 보인다면, 분명 현재 병렬처리를 하고 있는데도

시간단축이 안되는 이유는 무엇인지 궁금하네요. ㅡㅡㅋ

그럼 좀더 작업을 진행하고 경과 사항 다시 한번 올리겠습니다. 수고들 하세요.

koreteck의 이미지

해결 완료 되었습니다.

정말 문제는 어이없는 곳에서 발생하였습니다. 작성한 코드 문제 없었습니다. 잘 동작하였습니다.

문제는 시간측정함수 => clock()이 문제였습니다.

clock()함수는 프로세스에서 사용한 총 clock 타임을 반환하는 듯 합니다. 1개가 10초를 사용하나, 4개가 2.5초 씩 사용하나 결국 사용시간은 10초가 되어 버리는 겁니다.

ㅡㅡ; 이것으로 2~3일 버린 것 같네요.

clock()함수 대신에 clock_gettime()를 사용하니 시간이 잘 나오네요.

실제 스탑와치로 시간을 측정하니 분명히 처리시간은 줄어드는데, 출력은 그대로인겁니다.

이 부분은 윈도우에서도 동일하게 발생할 수 있는 문제입니다.

(윈도우에서 테스트 해보았는데, 특정 함수들은 아예 시간이 안나오는 경우도 있네요. 시스템 및 하드웨어에 따라 틀릴 수도 있으니 직접 해보셔야 할 듯 합니다.)

혹시 듀얼 또는 멀티코어에서 같은 문제가 있으신 분들은 시간측정 함수를 잘 선정하시기를 바랍니다.

그럼 좋은 하루들 되세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.