convolution연산을 C로 구현했는데 좀 도와주세요 ㅜㅜ
글쓴이: moonbung / 작성시간: 월, 2020/04/27 - 11:45오후
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:
첨부 | 파일 크기 |
---|---|
![]() | 8.49 KB |
Forums:
코드가 안보입니다
코드 입력 또는 들여쓰기가 필요한 내용의 경우,
<code> tag block 을 이용하여 작성 하십시오.
For code entry or indentation, use the <code> tag block.
수정했습니다 조언 부탁드려요!
수정했습니다 조언 부탁드려요!
대충 봐서
알고리즘을 고치지 않는다면 (자세히 보지 않아서 고칠 수 있는지 모르겠습니다), 가장 바깥의 루프만 보면 loop carried dependency가 없어 보이네요. 데이터 전체 사이즈가 충분히 크다면 multithreading을 생각해 볼 수 있을 것 같습니다. 수동으로 하실 수도 있고 openmp를 사용할 수도 있을 것 같구요. openmp는 컴파일러가 loop을 직접 몇 개의 thread로 쪼개주는 방식입니다.
안쪽의 3차원 네스티드 루프 제일 안쪽은 컴파일러가 SIMD를 써서 코드 생성을 할 것 같구요. openmp를 쓰실 경우에 루프 제일 안쪽이 SIMD로 처리 되는지 정도만 확인해 볼 것 같습니다.
그리고
알고리즘을 잠깐 보니 중복 계산은 없지만 덧셈보단 곱셈이 많네요.
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개의 수를 먼저 더해놓고 곱셈은 한 번만 하는 것도 생각해 볼 수 있을 것 같습니다.
댓글 달기