2017-11-20 30 views
-1

나는 완전히 cuda에 익숙하다. 주어진 입력 행렬, convolution (또는 filter)과 출력 행렬을 주어 convolution을 계산하는 cuda 커널을 작성하고 싶다.convolutions을 위해 cuda 커널을 작성하는 방법은 무엇입니까?

주 : 나는 cuda 커널의 각 스레드가 출력 매트릭스에서 하나의 값을 계산하기를 원합니다.

어떻게하면됩니까?

+0

쿠다 웹 사이트에는 수십 가지 예가있었습니다. 특히 컨볼 루션은 매우 일반적인 작업이라는 점을 고려할 때 특히 그렇습니다. 변경 되었습니까? 아니면 거기에서 아무 것도 찾지 못 했습니까? – CWBudde

+0

@CWBudde 귀하의 의견에 감사드립니다. 예, 웹 사이트 전체에서 많은 어려운 사례가있는 긴 예를 몇 개 발견했지만 아직 불행히도 간단하지 않습니다. 네가 가진다면 나보다 행복해 할 것이다. 귀하의 의견과 예를 들어 주셔서 감사합니다 – Bilgin

답변

0

필터가 매트릭스의 채우기 범위를 포함하면 cublasSgemm으로 직접 변환 될 수 있습니다.

예를 들어 행렬의 크기가 5 * 4이고 130 개의 필터가 필요하다고 가정하면 훈련 할 필터 행렬의 크기는 130 * 20이고 5 * 4 행렬은 20 * 1.

이렇게 계산 속도가 최적입니다. m1 (130, 20)과 m2 (20, 1) 사이의 행렬 곱셈으로 변환됩니다.

+0

. 문제에 대해 어느 정도 이해가되었습니다. 이를 수행 할 몇 가지 cuda 코드 예제가 있습니까? 가능한 경우 실제 예제로 어떻게 작동하는지 알고 싶습니다. 감사합니다 – Bilgin

+0

나는 항상 "JCuda"와 함께 Cuda 라이브러리를 호출하므로 코드는 C가 아닙니다. 웹에서 cublasSgemm 예제와 Cuda 매뉴얼의 예제를 확인할 수 있습니다. sgemm을 'N'및 'N'으로 조작하고 lda, ldb 및 ldc를 130, 20 및 130으로 설정하십시오. cublasSgemm 메소드 사용에 익숙해지는 데는 약간의 시간이 걸립니다. 덕분에 – Tom

+0

에게 감사드립니다. 물론 내가 확인하고 코드하고 내가 당신을 업데이 트됩니다. – Bilgin

0

이미지 컨볼 루션 커널을 찾는 경우이 링크가 도움이 될 수 있습니다 (Two Dimensional (2D) Image Convolution in CUDA by Shared & Constant Memory: An Optimized way).

제가 아는 한, 각 스레드를 사용하여 출력에서 ​​픽셀이나 위치를 계산하는 것은 그리 좋은 방법이 아닙니다. 이 컨볼 루션의 하위 영역이로드되는 방법 또는 동일한 워프의 스레드가 각 읽기에서 연속 메모리를 읽는지 여부를 고려하십시오. 그렇지 않으면 수백 개의 스레드가 사용 가능하더라도 커널은 데이터 로딩에 어려움을 겪을 수 있습니다.

따라서 기본적으로 설명 된 코드를 작성하고 추가 최적화 제안을 위해 프로파일 러 (nvvp)를 사용할 수 있습니다.

+0

의견 및 참고 웹 사이트 주셔서 감사합니다. 나는 CUDA를 사용하여 GPU에서 사용하기위한 2 차원 컨볼 루션 커널을 만드는 것을 찾고 있습니다. 결국, 내 코드는 입력, 필터 및 출력 행렬을 인쇄하고 싶습니다. – Bilgin