convolution연산을 C로 구현했는데 좀 도와주세요 ㅜㅜ

moonbung의 이미지

for(i=0; i<res_out_dim; i++){
            while(count < *col-kernel_size+1)
            {                
                for(j=0; j<in_dim; j++)
                {                                       
                    for(k=count; k<kernel_size+count; k++)
                    {
                        featureMaps[i][count] += source[j][k]*filter[j][k-count];
                    }
                }               
                count++;               
            }
            count = 0;          
 }

4중 for문이 돌게 되어 있는데, 연산속도를 빠르게 한다든지, 연산량을 줄일 수 있는 방법이 있을까요??
File attachments: 
첨부파일 크기
Image icon for.GIF8.49 KB
익명 사용자의 이미지

코드 입력 또는 들여쓰기가 필요한 내용의 경우,
<code> tag block 을 이용하여 작성 하십시오.

For code entry or indentation, use the <code> tag block.

moonbung의 이미지

수정했습니다 조언 부탁드려요!

Stephen Kyoungwon Kim@Google의 이미지

알고리즘을 고치지 않는다면 (자세히 보지 않아서 고칠 수 있는지 모르겠습니다), 가장 바깥의 루프만 보면 loop carried dependency가 없어 보이네요. 데이터 전체 사이즈가 충분히 크다면 multithreading을 생각해 볼 수 있을 것 같습니다. 수동으로 하실 수도 있고 openmp를 사용할 수도 있을 것 같구요. openmp는 컴파일러가 loop을 직접 몇 개의 thread로 쪼개주는 방식입니다.

안쪽의 3차원 네스티드 루프 제일 안쪽은 컴파일러가 SIMD를 써서 코드 생성을 할 것 같구요. openmp를 쓰실 경우에 루프 제일 안쪽이 SIMD로 처리 되는지 정도만 확인해 볼 것 같습니다.

Stephen Kyoungwon Kim@Google의 이미지

알고리즘을 잠깐 보니 중복 계산은 없지만 덧셈보단 곱셈이 많네요.

i와 count를 고정시켜 놓고, nested loop 안쪽 두 개만 들여다 보면 이런 것 같습니다.

filter(j)는 크기 N의 윈도우인 것 같고, source[j]에서 크기 N의 무빙 윈도우를 처음부터 끝까지 움직이면서 filter와 convultion을 해서 전부 합산하는 것 같네요. filter(j)[p]의 입장에서 생각해 보면, 여기에 곱해지는 건 source[j][p]부터 source[j][p+N-1]까지입니다. 따라서 이 N개의 수와 먼저 곱해서 각각 더하느니, 이 N개의 수를 먼저 더해놓고 곱셈은 한 번만 하는 것도 생각해 볼 수 있을 것 같습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.