2013-02-27 3 views
1

편집 :신경망에서 피드 포워드 알고리즘에 대한 내 Verilog 코드 최적화

모든 제안 주셔서 감사합니다. 나는 이것을 원래의 질문에 더 잘 써야 했음에 틀림 없다. prod [0] < = prod [0] + 입력 [0] x 가중치 1 [i]; 최대 [25]까지는 200 클럭주기 동안 실행됩니다. 그러나 26 회의 곱셈은 병렬로 발생합니다. 한 번에 너무 많은가요? 또는 하나의 클럭 사이클에서 1 곱셈 (32 비트 x 32 비트)을 수행해야합니까? 즉 200 x 26 곱셈을 200 x 26 클럭주기 이상 수행해야합니까? 병렬

  1. 26 행렬 곱셈은 200 배 (200 클록 사이클) 되풀이

    또한 I 관통 파이프 라인 스테이지 (6) 전체를 갖는다.

  2. 약 200 개의 요소가있는 LUT로 구성된 활성화 모듈이 해당 작업을 수행하고 결과를 보낼 수 있도록 제어 플래그를 설정합니다. 뉴런 당 25 회 반복 (25 클록주기 이상).

  3. 활성화 기능을 중지하기위한 플래그를 재설정합니다. 다음 부분을 준비하기 위해 카운터와 모든 것을 재설정하십시오.

  4. 병렬로 행렬 곱셈을 25 번 반복 (25 클럭 사이클).

  5. 다시 활성화 함수를 호출하십시오.

  6. 출력 결과를 알아 내기 위해 6에서 얻은 세 가지 값의 최대 값을 찾습니다 (이것은 분류 문제입니다).

위의 단계와 클럭주기 당 곱셈의 수 (1 단계에서 25 단계, 2 단계에서 3 단계)가 좋습니까?

아니면 200x25 클럭주기 동안 2 단계를 실행하고 10x3 클럭주기 이상 실행하려면 4 단계를 다시 실행해야합니까? 모든 도움과 조언들에 대한

고마워,

파이

ORIGINAL :

내가 코딩과 인공 신경망의 피드 포워드 알고리즘에 대한 모듈을 시뮬레이션했다. 합성 툴은 오랜 시간이 걸립니다 (Synopsys DCS 및 Xilinx ISE 14.4) ... 9 시간 이상 실행되었으므로 그것에 대해 정말 안좋은 생각이 들었습니다! 그러나 시뮬레이션 결과는 정확합니다.

나는 (메시지 끝 부분에서) 새로운 디자인에 대한 아이디어를 가지고 있지만 경험 많은 사람들이 그것을 실행하여 내 현재 구현 (아래 참조)보다 나쁘고, 이렇게 많은 산술 연산을보다 효율적으로 만들 수 있습니까?

네트워크의 일부 배경 :

입력 층 (200 개)의 입력을 가지며,

은닉층 25 개 뉴런

출력층 3 개 출력을 가지고있다.

Verilog 코드 아이디어 : 전체 알고리즘을 구현하는 모듈이 하나뿐입니다. 는

prod[0] <= prod[0] + input[0] x weight1[i]; i = 0 to 200-1

를 산출

  1. 첫 번째 단계는 각각의 신경 세포에 대한 가중치 (그 중 200)가 입력 (그 중 200)를 곱한다 (25 개 뉴런있다) .......

    prod[25] <= prod[25] + input[25] x weight1[i]; i = 0 to 200-1

    그리고 위의 반복 200 개의 입력 각각에 대해 200 번. 동시에 25 개의 모든 뉴런을 계산합니다.

    1. 다음으로, 위 결과에 대해 ANN 활성화 함수가 호출됩니다. 이것은 200 개의 엘레멘트를 가진 LUT를 사용하여 완성됩니다 (나는 case 문을 사용했습니다). 이를 위해 또 하나의 activation.v 파일을 작성하여 각 뉴런마다 25 번 인스턴스화해야했습니다!

    2. 다음, 최종 3 개 뉴런에 대한 가중치와 상기 결과 승산 :

      prod_2[1] <= prod_2[1] + prod[0]*weight2[i]; i = 0 to 25-1;

      prod_2[2] <= prod_2[2] + prod[0]*weight2[i]; i = 0 to 25-1;

    prod_2[0] <= prod_2[0] + prod[0]*weight2[i]; i = 0 to 25-1;

    와의 각각에 대한 상기 25 회 반복 25 입력을 자극했다. 동시에 3 개의 출력 뉴런 모두에 대해 계산을 수행하고 있습니다.

    1. 마지막 단계는 prod_2 [0-2]에서 sigmoid를 호출하는 것입니다. 이를 위해 3 개의 활성화 모듈을 추가로 인스턴스화해야했습니다.

    시뮬레이션 결과는 훌륭합니다. 그러나 아마 무섭게 비효율적이다! !!!

    그래서 이것이 더 좋은 아이디어인지 알고 싶습니다.

    Top_Module은 -> 신경 - (!이 28 뉴런의 인스턴스를 필요)> 곱셈 및 활성화

    상위 모듈은 신경 세포의 기능을 호출하고 여기에 관련 입력과 가중치를 전달합니다. 뉴런 함수는 곱셈 모듈을 호출합니다 (첫 번째 부분은 200 개, 두 번째 부분은 25 개가 필요함). 뉴런 함수는 다음으로 위의 200 개의 결과를 추가하고 (파트 2에서는 25 개) 활성화 함수를 호출합니다. 출력은 마침내 Top_Module로 돌아갑니다.

    내 질문 :

    1. 이 더 효율적입니다 그 하나 개의 모듈에 모든 것을 수행 된 이전 구현?

    2. 28 개 뉴런의 인스턴스이며, 각각의 뉴런은 200 개 곱하기 모듈 나쁜 또는 좋은를 인스턴스화?

    3. Synopsys Design Compiler가 12 시간이 걸리지 않도록 다른 코드를 작성하는 것이 좋습니다.

    4. 이렇게하면 각 뉴런에는 200 개의 입력과 200 개의 가중치가 입력 포트가됩니다. 나는 Verilog 모듈이 서로 배열을 전달할 수 있다고 생각하지 않았다. 그렇지 않다면 배열을 전달하는 대신 수동으로 400 개의 포트를 모두 써야합니까? 이러한 도구 모듈을 인스턴스화에 대해 가지 방법

    이상한 질문 죄송

    하지만 전체 합성 개념 싶어 새로운 오전 알아?

    감사합니다.

    파이살.

+0

정말 큰 곱셈입니다. 귀하의 디자인은 각 곱셈간에 유사하게 보이므로, 모듈로 선언하고 생성을 사용할 수 있다고 생각합니다. 이 방법이 빠를 수도 있습니다. – Khanh

+0

좋습니다. 제안에 감사드립니다 ... 나는 그것을 시도 할 것이고 잘하면, 그것은 더 효율적 일 것이다. –

답변

1

이 모든 것을 병렬로 처리하려는 것처럼 들리므로 많은 라우팅과 많은 승수가 필요합니다.

각 뉴런에 대해 한 번에 하나의 입력 * 체중만을 업데이트하도록 0..200 루프를 완료하려면 200 틱이 필요하므로 다시 작업해야 할 수 있습니다.

+0

글쎄, prod [0] <= prod [0] + input [0] x weight1 [i]; upto prod [25]는 200 클럭주기 동안 실행됩니다. 내 게시물에서 그것을 명확히하지 않아서 미안해. 그러나 26 회의 곱셈은 병렬로 발생합니다. 한 번에 너무 많은가요? 또는 하나의 클럭 사이클에서 1 곱셈 (32 비트 x 32 비트)을 수행해야합니까? 즉 200 x 26 곱셈을 200 x 26 클럭주기 이상 수행해야합니까? 이게 더 좋은가요? –

1

Synopsys Design Compiler가 12 시간이 걸리지 않도록 내 코드를 효율적으로 만드는 다른 아이디어가 있습니까? !!

이전 제안 사항은 좋지만 현재 디자인을 모두 볼 수는 없지만 모듈 사이에 충분한 파이프 라인 단계가 있는지 확인하십시오. 중요한 경로가 타이밍에 정말로 길다면, 시놉시스는 아마도 불가능한 타이밍 제약 조건을 충족시키기 위해 승수를 조정하려고 오랜 시간 동안 갈아 치울 것입니다.

또한 필요한 클럭 주파수를 줄이면 경로 제한을 완화하여 합성을 쉽게 할 수 있습니다.

또한, 200 배수를 유지하면 ('해야한다고 말하지 않고),'합성 파티셔닝 '을 살펴 보는 것이 유용 할 것이지만, 이것을 수행하는 방법은 사용중인 합성 도구에 달려 있습니다. 기본적으로 하나의 모듈/파티션을 합성 한 다음 모든 모듈을 한 번에 합성하는 대신 필요한만큼 여러 번 해당 파티션을 복제합니다. 귀하의 디자인은 아마도 200 개의 모든 곱셈 유닛을 통해 그 경로를 독립적으로 최적화하려고 시도하는 것이므로 실제로 각각의 합성 네트리스트를 사용할 수 있습니다. 자일링스에 대한 정보는 여기를 참고하십시오 : http://www.xilinx.com/support/documentation/application_notes/xapp918.pdf

관련 문제