1. Trang chủ
  2. » Luận Văn - Báo Cáo

Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU

91 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Neuromorphic Computing trên nền tảng GPU
Tác giả Trần Ngọc Thịnh
Người hướng dẫn TS. Phạm Quốc Cường
Trường học Đại Học Quốc Gia Tp. HCM
Chuyên ngành Khoa học máy tính
Thể loại Luận văn thạc sĩ
Năm xuất bản 2018
Thành phố Tp. Hồ Chí Minh
Định dạng
Số trang 91
Dung lượng 8,37 MB

Cấu trúc

  • Chương 1 Giới thiệu (13)
    • 1.1. Mục tiêu bài viết (15)
    • 1.2. Bố cục luận văn (15)
  • Chương 2 Mô hình mô phỏng não bộ (16)
    • 2.1. Não bộ, mạng neuron và neuron (16)
    • 2.2 Mô hình hành vi của neuron (19)
      • 2.2.1 Các mô hình thể thức (21)
      • 2.2.2 Mô hình sinh lý học (22)
      • 2.2.3 Mô hình mở rộng (28)
    • 2.3 So sánh các mô hình (30)
  • Chương 3 Cơ sở lý thuyết (36)
    • 3.1 Kiến trúc của GPU (37)
      • 3.1.1 Kiến trúc Fermi (38)
      • 3.1.2 Kiến trúc Kepler (44)
      • 3.1.3 Kiến trúc Maxwell (46)
      • 3.1.4 Kiến trúc Pascal (46)
        • 3.1.4.1 Hiệu năng tính toán số thực dấu chấm động (46)
        • 3.1.4.2 NVlink (47)
        • 3.1.4.3 HBM2 (47)
        • 3.1.4.4 So sánh với các kiến trúc GPU đời trước (48)
    • 3.2 CUDA framework (48)
      • 3.2.1 CUDA program (49)
      • 3.2.2 CUDA memory hierarchy and manipulation (51)
      • 3.2.3 Exploit parallelism sử dụng CUDA (54)
      • 3.2.4 Synchronization (54)
    • 3.3 Model mapping trên GPU (55)
  • Chương 4 Mô hình bài toán (58)
    • 4.1 Tế bào trám hành (58)
    • 4.2 Mô hình trám hành (IO) (59)
    • 4.3 Hiện thực mô hình theo ngôn ngữ lập trình C (61)
  • Chương 5 Hiện thực mô hình dùng CUDA framework (65)
    • 5.1 Chuyển đổi tính toán tuần tự sang tính toán song song (65)
    • 5.2 Chia lưới tính toán trên GPU sử dụng CUDA framework (67)
    • 5.3 Chuyển đổi quản lý bộ nhớ chương trình từ GPU sang CPU (69)
    • 5.4 Xác định số thứ tự neuron trong lưới (70)
    • 5.5 Phân tích thời gian tính toán trên GPU (71)
    • 5.6 Tối ưu giải thuật (71)
      • 5.6.1 Thông tin cấu hình GPU GTX 1080Ti (71)
      • 5.6.2 Lựa chọn kích thước block trong lưới mô phỏng (72)
      • 5.6.3 Tính toán sử dụng số thực float16 (74)
      • 5.6.4 Tính toán sử dụng SFU trên GPU (77)
  • Chương 6 Kết quả thực nghiệm (78)
    • 6.1 Kết quả mô phỏng (78)
      • 6.1.1 Mô phỏng đáp ứng xung (79)
      • 6.1.2 Thời gian mô phỏng trên CPU (81)
      • 6.1.3 Thời gian mô phỏng trên GPU 1080Ti với block size khác nhau (82)
      • 6.1.4 Thời gian mô phỏng trên GPU 1080Ti với độ chính xác khác nhau (83)
      • 6.1.5 So sánh thời gian mô phỏng trên GPU float32 với CPU float32 (84)
      • 6.1.6 So sánh thời gian mô phỏng trên GPU float32 với cải tiến giải thuật (85)
      • 6.1.7 So sánh thời gian mô phỏng trên CPU float32 với cải tiến giải thuật (86)
    • 6.2 Kết luận (87)
  • TÀI LIỆU THAM KHẢO (89)

Nội dung

Những mô phỏng dựa trên các mô hình đó có thể tạo được sức ảnh hưởng lớn đối với xã hội như là việc có thể chữa trị được phần não bộ bị hư hại.. Cụ thể trong luận văn này, tác giả mô tả

Giới thiệu

Mục tiêu bài viết

Bài viết cần đạt được các mục tiêu sau:

• Lựa chọn mô hình neuron: Một số mô hình sẽ được nghiên cứu và đánh giá dựa vào độ phức tạp trong tính toán, mức độ quan trọng về sinh vật học và tính thích hợp khi thực hiện trên nền tảng GPU Cuối cùng sẽ chọn ra một mô hình để tiến hành

• Thực hiện mô hình trên nền tảng GPU: Mô hình được lựa chọn sẽ được thực hiện và sử dụng công nghệ CUDA trên Nvidia’s GeForce GTX 1080Ti Việc thực hiện cần được tiến hành trên một số lượng đáng kể các tế bào neuron và bằng một quá trình mô phỏng đủ nhanh để tiếp cận được với hoạt động trong thời gian thực của mô hình SNN

• So sánh với hoạt động tương đương trên CPU: Kết quả sẽ được đánh giá so sánh với việc thực hiện bằng các mô hình tương đương trên các nền tảng khác như là CPU sử dụng ngôn ngữ C.

Bố cục luận văn

Luận văn này được sắp xếp theo bố cục sau:

• Chương 2 trình bày lý thuyết về mô hình neuron để mô phỏng mô hình SNN

• Chương 3 đưa ra những phân tích về nền tảng GPU cũng như là về ngôn ngữ lập trình CUDA để tương thích với mô hình được lựa chọn

• Chương 4 sẽ bàn về chi tiết các mô hình neuron của chùm dây thần kinh dưới tiểu não (Inferior Olive - IO) trong hệ thống mạng lưới, nghiên cứu quá trình tiến hành trên CPU và cả trên GPU

• Chương 5 sẽ nói về việc hiện thực hệ thống mô phỏng

• Cuối cùng, chương 6 sẽ đưa ra kết quả đạt được và thảo luận về các kết quả đó Kết luận của luận văn này này đồng thời đề xuất thêm các nghiên cứu khác cho chủ đề này

Mô hình mô phỏng não bộ

Não bộ, mạng neuron và neuron

Hình 2.1 - Cấu tạo của bộ não người [7]

10 Não bộ được xem là cơ quan quan trọng nhất và tinh vi nhất trong cơ thể con người bởi nó là bộ phận giúp con người suy nghĩ và không thể thay thế bởi cơ quan nào khác được Nó có thể xử lý dữ liệu với tốc độ cực kỳ nhanh, tiêu tốn ít năng lượng và có thể cùng lúc điều khiển được thần kinh ngoại biên Lấy cảm hứng từ những khả năng đặc biệt này của não bộ, những ý tưởng về trí tuệ nhân tạo và điều khiển bằng robot đã không ngừng phát triển Tuy nhiên, việc tạo ra một hệ thống có thể thực hiện những hoạt động tương tự đó vẫn là một thách thức đối với các nhà khoa học Chính vì vậy, càng ngày càng có nhiều những nghiên cứu được tiến hành để có thể hiểu rõ hơn về bộ não người Để giải thích rõ hơn về hoạt động của não người, đã có rất nhiều ý tưởng được kiến nghị và thử nghiệm trên nhiều thí nghiệm khác nhau Franz Joseph Gall, một nhà vật lý học và giải phẫu học neuron người Đức đã đề xuất ý kiến rằng những khu vực khác nhau trên não bộ sẽ chịu trách nhiệm cho những hoạt động khác nhau Chính ý tưởng này của ông đã đặt viên đá nền tảng cho những nghiên cứu về não bộ sau này

Thông qua việc tiến hành thí nghiệm để giám sát các hoạt động của não bộ trong khi nó đang thực hiện các nhiệm vụ cụ thể, não có thể được chia ra thành 3 khu vực: não trước, não giữa và não sau Não bộ cùng với tủy sống được gọi là hệ thần kinh trung ương Hệ thần kinh trung ương là một khái niệm rộng lớn bao gồm 7 phần chính: 1 Tủy sống, 2 Não dưới (phần cuối não dính với tủy sống), 3 Cầu não, 4 Tiểu não, 5 Não giữa, 6 Não trung gian và 7 Hai bán cầu não, như hình 2.1 Hệ thần kinh trung ương của chúng ta có tính đối xứng hai bên, tức là nó sẽ gồm có các cặp đối xứng nhau Mỗi cặp này đều hoạt động cùng nhau hoặc đơn lẻ để hình thành nên hành vi và nhận thức của con người Tủy sống là hệ thống tỏa ra khắp nơi để có thể tiếp nhận thông tin từ da, khớp, và cơ bắp có chức năng điều khiển hoạt động của chân tay và thân người Tủy sống và não bộ được liên kết với nhau bởi thân não để điều chỉnh mức độ thức tỉnh cũng như nhận thức của con người Thân não bao gồm não dưới, cầu não và não giữa Não dưới chịu trách nhiệm cho các hoạt động tự trị quan trọng như là tiêu hóa, hô hấp và nhịp tim Cầu não là nơi truyền thông tin về chuyển động từ hai bán cầu não đến tiểu não Não giữa chịu trách nhiệm về các giác quan và điều khiển hoạt động của chúng như là chuyển động mắt và sự phối hợp các phản xạ của thị giác và thính giác Tiểu não điều chỉnh mức độ và phạm vi của chuyển động và có liên quan đến việc học hỏi các kĩ năng vận động Não trung gian bao gồm đồi não (nơi xử lý thông tin đưa đến vỏ não từ các phần khác của hệ thần kinh trung ương) và vùng dưới đồi não (nơi điều khiển các hoạt động tự trị, nội tiết và nội tạng) Phần lớn nhất của não bộ chính là 2 bán cầu não với vỏ ngoài đầy nếp nhăn (vỏ ngoài của bán cầu não gồm vỏ não

11 và hạch nền), hồi hải mã và nhân hạch não Hạch nền có chức năng điều khiển các hoạt động vận động, hồi hải mã chịu trách nhiệm về lưu trữ kí ức và nhân hạch não tham gia vào các phản ứng tự trị và nội tiết của các trạng thái cảm xúc

Bên cạnh hệ thần kinh trung ương còn có hệ thần kinh ngoại biên bao gồm các cơ quan cảm thụ và cơ quan phản ứng lại kích thích Các neuron liên hệ mật thiết với thụ quan và cơ quan phản ứng để hình thành nên một mạng lưới hoạt động Các thụ quan cung cấp thông tin cho mạng neuron bằng cách liên tục điều tiết môi trường bên ngoài và bên trong Các neuron sẽ kết hợp các tín hiệu đã được mã hóa từ các thụ quan để ngăn chặn các neuron với các tín hiệu tạo ra tương tác tương thích với môi trường bên ngoài Còn các cơ quan phản ứng thì tiếp nhận các tín hiệu đã được xử lý từ neuron và điều khiển các hoạt động bằng việc so sánh trạng thái hiện tại và trạng trái đích của hệ thống

Bộ phận lớn nhất trong hệ thần kinh trung ương chính là bộ não Bộ não con người chứa đựng hơn 100 tỉ tế bào thần kinh được liên kết với nhau theo một hệ thống được gọi là mạng neuron Mạng neuron là một mạng lưới gồm các tế bào, nhưng nó không chỉ là một dây chuyền vận chuyển tín hiệu vào và ra; nó là một mạng lưới khổng lồ bao gồm các tế bào được liên kết với nhau theo các vòng luân chu và thành bó lộn xộn Những liên kết đó giúp các tín hiệu vào có thể tương tác với nhau cộng với sự tương tác với dư lượng cùa hàng tỉ các tín hiệu đã diễn ra ở quá khứ trong hệ thống Chính vì vậy, không chỉ các tín hiệu đầu ra được sản sinh ra mà các thuộc tính của cả mạng lưới đều thay đổi Do đó các kinh nghiệm trong quá khứ sẽ đều được phản ánh trong các hành vi diễn ra ở tương lai

Tế bào trong hệ thần kinh trung ương được gọi là neuron Một điều khá quan trọng cần được nhắc đến ở đây đó là neuron có vô số loại Tuy nhiên, cấu trúc và tính chất của các loại neuron đều tương tự nhau

Hình 2.2 - Cấu tạo của neuron [7]

12 Một neuron bao gồm 4 yếu tố: thân neuron (soma), sợi nhánh (dendrites), sợi trục (axon) và cổng trước xi-náp (synapse) Các bộ phận đó đều góp phần giúp cho việc sản sinh và liên lạc của tín hiệu giữa các neuron với nhau Phần chính giữa của neuron được gọi là soma chứa gen của tế bào và lưới nội bào (phần bên ngoài của nhân) Từ thân neuron, sẽ có 2 loại nhánh vươn ra tạo thành các chùm sợi nhánh ngắn và một sợi trục dài Các sợi nhánh có hình dạng như cái cây mang nhiệm vụ nhận các tín hiệu được truyền tới từ các tế bào, còn sợi trục sẽ dẫn các tín hiệu từ xa đến các neuron khác Tín hiệu nói đến ở đây chính là tín hiệu điện và được xem là động lực dẫn đến các cử động Một phần đặc biệt của sợi trục neuron đó là đồi sợi trục nằm ở phần đầu của sợi trục hay chính là phần kết nối giữa thân neuron và sợi trục Đồi sợi trục giúp xử lý tín hiệu ban đầu và đảm bảo sự dẫn truyền không bị mất mát hoặc sai khác với tốc độ là 1-100 mét/giây, nhờ vậy mà động lực cử động được dẫn truyền một cách mạnh mẽ đến cổng trước xi-náp bất kể độ dài ngắn của sợi trục Xi-náp là điểm kết nối giữa 2 neuron Có 2 loại: phần trước xi-náp và sau xi-náp lần lượt liên kết với neuron dẫn truyền và neuron tiếp nhận

Ngoài neuron thần kinh ra, còn có 1 loại tế bào trong hệ thần kinh gọi là tế bào thần kinh đệm giữ chức năng hỗ trợ cho hoạt động của neuron Mặc dù biết rằng tế bào thần kinh đệm không tham gia vào các thông tin được xử lý trong mạng lưới neuron, nhưng số lượng tế bào này lại nhiều hơn gấp 10 đến 50 lần số lượng neuron

Các tế bào thần kinh đệm bao quanh các neuron nhưng không có chức năng liên kết chúng với nhau hay có bất cứ chức năng gì trong việc dẫn truyền thông tin.

Mô hình hành vi của neuron

Các neuron được bao bọc bởi một chất lỏng gọi là màng tế bào Nồng độ ion trong màng tế bào khác với môi trường xung quanh Sự khác biệt này tạo ra điện thế, cũng là ý tưởng chủ đạo của động lực học thần kinh

Như đã đề cập ở phần trước, các tín hiệu đầu vào của một neuron được thu thập bởi sợi nhánh Điện thế của sợi nhánh và soma được kết hợp để tạo ra điện thế của neuron Sự chênh lệch giữa điện thế của neuron và điện thế của màng tạo ra một hiệu điện thế ở gò sợi trục (Axon Hillock) Nếu điện thế ở gò sợi trục vượt quá một ngưỡng nhất định thì sẽ xảy ra quá trình tái tạo Kết quả của quá trình này là tạo ra một thế động tác (sự thay đổi điện thế xảy ra ngang qua màng neuron) lan truyền trong sợi trục Sau quá trình này sẽ xảy ra một giai đoạn trơ ì ngắn, khi đó sẽ không có xung mới nào được tạo ra ở gò sợi trục

Sự thay đổi điện thế lan truyền dọc theo sợi trục có thể được mô tả bằng cách sử dụng phương trình sau [8]:

Trong đó, điện áp khởi đầu tại một điểm trên sợi trục là V0, và trong trường hợp này, điện thế sẽ giảm theo số mũ, nghĩa là điện áp ở khoảng cách x tính từ điểm khởi đầu được mô tả như sau:

Mỗi sợi trục có hằng số chiều dài cụ thể riêng của nó, được định nghĩa là khoảng cách mà tại đó điện thế được giảm theo hệ số 1/e Tuy nhiên, phương trình này dường như vấp phải một vấn đề Đối với một sợi trục ngắn, tín hiệu lan truyền có thể đủ lớn để đi từ đầu này đến đầu kia, nhưng điều này không áp dụng được đối với sợi trục dài, vì tín hiệu có thể sẽ mất đi trước khi đến đầu kia Do đó, hầu hết các mô hình đều giả định rằng trong trường hợp sự điện thế thay đổi vượt quá ngưỡng, xung có thể được tạo ra để bảo toàn toàn bộ biên độ khi truyền trong sợi trục Do đó, thế hành động ở đây được xác định như là một xung không giảm của hiệu điện thế

Sự lan truyền thế hành động tạo ra bởi các dòng ion, chủ yếu là natri và kali trong màng Ví dụ, Hodgkin và Huxley đã cho rằng độ dẫn của màng tế bào tới các ion natri và kali phụ thuộc vào điện thế màng tế bào, là hiệu điện thế giữa bên trong và bên ngoài của neuron Do đó phương trình tế bào thực là phương trình trong đó độ dẫn của natri và kali thay đổi phụ thuộc vào điện áp và thời gian

Mặc dù việc trao đổi tín hiệu xảy ra giữa hai neuron, vẫn còn một khoảng trống gọi là khe xi-náp nằm giữa phần trước xi-náp và sau xi-náp của hai tế bào liền kề Khe xi-náp hoạt động như một tụ điện Sự truyền tải thế hành động trong khu vực này không phải là sự truyền điện mà là một phản ứng hóa học Ở đuôi của phần trước xi-náp, xung truyền đến sẽ giải phóng các phân tử phát và được lưu trữ trong các túi nhỏ Phân tử phát sẽ liên kết với các thụ thể ở màng của phần sau xi-náp sau khi đi qua một khe xi-náp rất nhỏ Phân tử phát có thể gây ra hai tác động: kích thích và ức chế Tác dụng kích thích sẽ làm tăng hiệu điện thế khi đi qua màng của phần sau xi-náp, trong khi sự ức chế sẽ làm giảm hiểu điện thế xuống dưới ngưỡng

Tác dụng kích thích hoặc ức chế của phân tử phát sẽ gây ra những thay đổi ở ngưỡng thay thế trong màng của phần sau xi-náp Sự thay đổi này có thể tạo ra một xung mới trong sợi trục của tế bào khác nếu có đầy đủ hai điều kiện sau: điện thế ở gò sợi trục vượt ngưỡng và sợi trục đã qua khỏi giai đoạn trơ ì ở ngưỡng trước

14 Hầu hết các mô hình thần kinh ngày nay được xây dựng dựa trên các tương tác kích thích và ức chế trong một thang thời gian nhanh Giả thiết được sử dụng chủ yếu trong các mô hình này đó là tốc độ trung bình của xung sẽ mang hầu hết các thông tin Một mô hình neuron đơn giản là một hàm toán học có một hoặc nhiều đầu vào có giá trị thực và tạo ra một hoặc nhiều đầu ra giá trị thực Các đặc tính khác của mô hình neuron như tuyến tính hoặc không tuyến tính, không thay đổi hoặc dễ thích nghi cũng sẽ khác nhau giữa mô hình này với mô hình kia Trong phần tiếp theo, tôi sẽ giới thiệu một vài mô hình của neuron

2.2.1 Các mô hình thể thức

Mô hình thể thức [8] là một mô hình ít giống với neuron thật nhất Trong mô hình này, các tác động kích thích và ức chế được kết hợp thành một input đơn

Neuron tự nó có một hoặc nhiều biến trạng thái sẽ được thêm vào input để có được output Điểm chung giữa các mô hình thể thức là nó chỉ xét đến tác dụng kích thích, ức chế và biến trạng thái của các neuron thực

Mô hình McCulloch-Pitts [8] còn được gọi là mô hình nhị phân bởi nó sử dụng xung nhị phân để biểu diễn giá trị của output Bất kỳ input ức chế của neuron hoạt động nào cũng làm cho output bị tắt, trong khi tất cả các input kích thích đang hoạt động x i sẽ được nhân với trọng lượng synapse của chúng w i và sau đó được cộng vào Output được đặt ở chế độ hoạt động khi tổng số vượt quá ngưỡng θ của neuron

Mô hình Perceptron [8] có một sự cải tiến so với mô hình McCulloch-Pitts đó là mô hình này có thể tạo ra output có giá trị thực Output có giá trị thực này thể hiện tốc độ bắn trung bình của tế bào Output được tính bằng hàm g của hiệu (V - θ) Hàm g có hình chữ S: nó tiệm cận về 0 khi V > θ

Những ưu điểm của mô hình này là: output không âm và có giá trị thực, và tốc độ bắn có một giới hạn trên

Có hai phiên bản của mô hình Hopfield: mô hình nhị phân và mô hình giá trị liên tục [8] Trong mô hình nhị phân, output của một neuron là sự so sánh giữa V và θ Tuy nhiên, việc cập nhật trạng thái của một neuron được thực hiện tại một thời điểm ngẫu nhiên và độc lập với các neuron khác

Neuron đa thức [8] là một mô hình cung cấp thông tin về sự đóng góp của mỗi input vào output Do đó, mỗi input đều tương quan với input khác theo cặp hoặc nhóm bằng cách bao gồm một thuật ngữ nhân Output vẫn là tổng của những tích đó Biến trạng thái V có thể được sử dụng trong một hàm phi tuyến tính bình thường g sau đó

2.2.2 Mô hình sinh lý học

Các mô hình sinh lý học xem xét các tính chất của neuron và tạo ra các spike thay vì là các output có giá trị liên tục Vì thế chúng tương đối giống với các neuron thực

2.2.2.1 Các mô hình Integrate-and-fire

So sánh các mô hình

Việc so sánh các mô hình neuron có thể được nhìn nhận từ nhiều quan điểm khác nhau Trong bài này, việc so sánh sẽ được giới hạn trong một vài yếu tố chính liên quan đến ý nghĩa sinh học và chi phí thực hiện các mô hình sinh-lý Dựa vào các yếu tố đó, việc sử dụng GPU có hiệu quả hay không sẽ được đánh giá dựa vào việc so sánh nó với việc sử dụng CPU hay FPGA

Yếu tố đầu tiên đó là tốc độ spiking dưới dòng điện được duy trì liên tục Tốc độ spiking thực tế của neuron là 10-120Hz, do đó việc tạo ra tần suất spiking bằng tốc độ đó là rất quan trọng để mô phỏng một mô hình sinh học neuron hợp lý Kết quả mô phỏng ở hình 2.7a cho thấy mô hình Hodgkin-Huxley chỉ có thể tạo ra tốc độ spiking lớn hơn 50Hz và đồ thị tần suất là phi tuyến tính Nói cách khác, có một số tần suất cụ thể mà Hodgkin-Huxley không thể tạo ra được Mô hình neuron Wilson Polynomial (Hình 2.7d) có thể tạo ra tốc độ spiking phi tuyến tính tương tự như Hodgkin-Huxley nhưng với quy mô và phạm vi nhỏ hơn, có nghĩa là mô hình Wilson Polynomial có thể tạo ra tần suất lớn hơn nằm trong khoảng 70Hz-120Hz so với mô hình Hodgkin-Huxley Phạm vi tần suất của mô hình Spiking chính quy của Izhikevich (Hình 2.7b) và mô hình Leaky Intergrate-and-Fire (hình 2.7f) là tương tự nhau Chúng đều có thể tạo ra các spike trong phạm vi tấn suất từ 1-120Hz nhưng tần suất của mô hình Spiking do Izhikevich thiết kế lại theo kiểu tuyến tính, trong khi Leaky Intergrate-and-Fire thì là phi tuyến tính Nếu xét theo khía cạnh này thì mô hình FritzHugh-Nagumo (Hình 2.7e) được xem là mô hình yếu nhất vì tần suất cao nhất mà nó có thể tạo ra được chỉ thấp hơn 9Hz

Về mặt chi phí thực hiện, các mô hình theo kiểu thể thức là đơn giản nhất

Mặc dù xét về mặt hoạt động thực của neuron, chúng có ý nghĩa sinh học khá thấp nhưng chúng lại khá hữu dụng để xây dựng mạng lưới nbeuron nhân tạo và đồng thời giúp chúng ta hiểu rõ hơn các hoạt động cơ bản của neuron mà không cần phải sử dụng đến phần cứng phực tạp để thực hiện Trong khi đó, các mô hình sinh-lý học lại có chi phí cao hơn do số lượng tham số và biến số sử dụng trong các phương trình tính toán tăng cao Theo bảng 2.1, số lượng bộ ghi dùng để lưu trữ các biến số

24 của mô hình Hodgkin-Huxley và Wilson Polinomial Neuron lớn hơn gấp 2 lần so với các mô hình khác Điều kiện lưu trữ của các mô hình loại Intergrate-and-fire là khiêm tốn nhất vì mỗi mô hình chỉ có duy nhất một biến số

Xét về độ phức tạp, bảng 2.1 được đưa ra ở đây để tổng hợp sự phức tạp của tất cả các mô hình được thể hiện dưới dạng Phương trình phân số chuẩn (ODE) Các phương trình này được giải bằng phương pháp Euler, là một phương trình bậc nhất cố định có dạng x(t+τ) = x(t) + τf(x(t) với phép lấy tích phân bước thời gian τ để đạt được độ chính xác hợp lý Tất cả mô hình đều được mô phỏng với bước thời gian τ là 1 ms Số kết quả của các thao tác FLOPs (Số thực dấu phẩy động) được tham khảo ở phần [2] Hodgkin-Huxley, một lần nữa, là mô hình phức tạp nhất vì nó đòi hỏi đến 1200 FLOPs cho mô phỏng 1ms So với mô hình Integrate-and-Fire chỉ cần 5 FLOPs cho một mô phỏng tương tự, có một sự chênh lệch khá lớn giữa 2 mô hình về cả ý nghĩa sinh học lần độ phức tạp Mô hình Morris-Lecar cũng rất tốn kém với 600 FLOPs cho mô phỏng 1ms bởi nó có liên quan đến đường tiếp tuyến hyperbol và số mũ

Hình 2.7 - Tỉ lệ spiking của các mô hình neuron [15]

Bài báo [2] cũng đã đánh giá về chi phí tính toán của các loại mô hình khác nhau dựa vào khả năng của chúng khi thể hiện các đặc tính khác nhau của neuron

Tất cả mô hình đều được đánh giá về số lượng các đặc tính của neuron mà chúng có thể thể hiện được Empty box tức là mô hình có thể thể hiện các đặc tính đó theo lý thuyết, tuy nhiên tác giả lại không thể tùy chỉnh các tham số để đạt được các đặc tính được giới hạn trong một khoảng thời gian Một số đặc tính lại tự loại trừ lẫn

26 nhau, như là bộ cộng hưởng và tích hợp Do đó, một mô hình không thể nào có cả hai điều đó

Bảng 2.1 - So sánh độ phức tạp của các mô hình

Theo bảng 2.1, cả mô hình Hodgkin-Huxley và Wilson đều có thể thể hiện hầu hết các đặc tính sinh học Trong khi đó, mô hình integrate-and-fire lại chỉ thể hiện được 3/22 thuộc tính

Hình 2.8 - Xấp xỉ số lượng phép tính floating point dùng để mô phỏng trong 1ms

Toàn bộ so sánh giữa các mô hình dựa vào độ phức tạp và ý nghĩa sinh học đều được diễn tả trong hình 2.8 Mô hình của Izhikevich là mô hình hiệu quả nhất với chi phí thực hiện thấp nhất và tính hợp lý sinh học cao Dựa vào độ cong trong

27 hình 2.8 ta có thể đưa ra một kết luận cho các mô hình như sau: mô hình càng tốn nhiều chi phí thì tính hợp lý sinh học của nó càng cao Lời nhận xét này có thể hiểu được vì nếu chúng ta càng xem xét nhiều đặc tính của neuron thì các mô hình càng cần phải hoạt động nhiều hơn

Hình 2.9 - Ý nghĩa sinh học của các mô hình [2]

Nói tóm lại, để mô phỏng các mô hình phức tạp với số lượng neuron và mối liên kết giữa chúng tương tự như não bộ của chúng ta là vô cùng tốn kém Sợi trục và sợi nhánh cũng đóng một vai trò quan trọng trong việc mô hình hóa neuron

Không có một mô hình nào được nhắc tới trước đó, ngoại trừ mô hình mở rộng, có thể mô phỏng hoàn chỉnh hình dáng và đặc tính của sợi trục và sợi nhánh Đối với luận văn này, GPUs được sử dụng để đánh giá hoạt động của mô hình sinh-lý trên nền tảng tính toán hiệu suất cao Do đó, mô hình được chọn có thể tương đối phức tạp và có ý nghĩa sinh học lớn Bên cạnh đó, Hodgkin-Huxley được xem là mô hình thành công nhất trong số các mô hình điện toán nghiên cứu neuron [8] Tuy nhiên, việc mô phỏng một mô hình là rất đắt đỏ; do đó chúng ta chỉ có thể mô phỏng một sô lượng nhỏ các neuron trong thời gian thực Điều này khuyến khích việc sử dụng GPU cho mạng lưới neuron khi mà chúng ta có thể thu thập được các thông tin chi tiết về hoạt động và sự tương tác của một số lượng neuron lớn Do đó, Hodgkin-

28 Huxley là mô hình được chọn để mô phỏng các tế bào với số lượng lớn để tìm ra số lượng lớn nhất của tế bào mà vẫn có thể đảm bảo thực thi trong thời gian thực

Cơ sở lý thuyết

Kiến trúc của GPU

Hình 3.1 - GPU sử dụng nhiều transitor hơn để xử lý dữ liệu [16]

CPU sử dụng rất nhiều mạch điều khiển logic phức tạp để đạt được một hiệu suất cao trong khi chỉ để thực thi một chương trình tuần tự Mặc dù chương trình có thể được thực thi song song, nhưng code được thể hiện dưới dạng tuần tự Mặt khác, GPU sử dụng hầu hết các transistor để tính toán các chương trình song song

Nói cách khác, phần cứng mạch điều khiển logic xử lý nhiều hơn core xử lý rất nhiều để tính toán trong cùng một thời gian như hình minh họa 3.1 Ý tưởng kiến trúc chung của GPU là nhiều core được tổ chức thành nhiều bộ xử lý trực tiếp đa luồng (SM) Một SM gồm có một số core tính toán, mạch điều khiển logic và một hệ thống bộ nhớ Số lượng core cho mỗi SM phụ thuộc vào mỗi thế hệ của GPU Mỗi core trong một SM được gọi là một bộ xử lý trực tiếp (SP)

GPU sử dụng DRAM (có băng thông cao) bởi vì các ứng dụng đồ họa yêu cầu băng thông cao Các GPU hiện đại được kết nói với bus front-side để giao tiếp trực tiếp với CPU

Mô hình song song (được sử dụng trong GPU) là một lệnh nhưng đa luồng (SIMT) Warp là một nhóm luồng dữ liệu để thực hiện một tiến trình Các luồng thuộc cùng một warp thì bắt đầu cùng lúc và cùng thực hiện một lệnh Chúng có thể hoạt động độc lập vả có thể xảy ra rẽ nhánh Bộ lập lịch luồng trong mô hình SIMT được thực hiện bằng cách chọn một wrap sẵn sang để thực thi và sau đó thực thi các lệnh của luồng hoạt động của wrap đó Mỗi warp được ánh xạ tới một SP và thực thi độc lập với địa chỉ lệnh và thanh ghi trạng thái của SP Các warp chạy độc lập với nhau làm cho mô hình linh hoạt hơn mô hình SIMD bởi vì mô hình SIMD phải thực hiện tất các các lệnh đơn trên các dữ liệu khác nhau

31 Nvidia đã phát triển các kiến trúc GPU sau:

Hình 3.2 - Kiến trúc của Fermi 16 SM [17]

Kiến trúc Fermi có tới 512 core CUDA được tổ chức thành 16 SM 16 SM này được đặt xung quanh bộ nhớ đệm L2 Mỗi SM có bộ lập lịch và phân phối, các đơn vị thực thi, các tệp thanh ghi và một bộ nhớ đệm L1 riêng (được thể hiện trong hình 3.2) Kiến trúc Fermi có thể chứa đến 6GB GDDR5 DRAM được chia thành sáu phân vùng bộ nhớ 64-bit hoặc phân vùng bộ nhớ 384-bit

Hình 3.3 - Cấu trúc của Fermi Streaming Multiprocessor (SM) [17]

Kiến trúc Fermi được thể hiện trong hình 3.3 là thế hệ thứ ba của NVIDIA SM Nó có hiệu suất và khả năng lập trình hơn các kiến trúc trước

Các đơn vị tính toán của kiến trúc Fermi bao gồm:

- Mỗi SM có 32 SP, mỗi SP có đầy đủ các pipeline đơn vị luận lý toán học số nguyên (ALU) và đơn vị dấu chấm động (FPU) Bộ ALU hỗ trợ đầy đủ độ chính xác 32-bit cho tất cả các lệnh Độ chính xác 64-bit được hỗ trợ cho một số lệnh như shift, move, convert, compare, v.v Bộ FPU bổ sung chuẩn floating- point mới là IEEE 754-2008 cung cấp chỉ thị fused multiply – add (FMA) cho cả các phép tính chính xác đơn và chính xác kép FMA được cải thiện hơn chỉ thị multiply-add (MAD) bằng cách thực hiện các phép nhân và phép cộng mà không mất sự chính xác trong phép cộng Trong FMA, kết quả phép nhân không bị cắt ngắn các số cuối trước khi thực hiện phép cộng (được giải thích ở hình 3.4) Một cải tiến của kiến trúc Fermi là 16 double precision FMA có thể thực thi trên một xung clock Hiệu suất tính toán double precision là 4.2 lần, nhanh hơn so với GPU thế hệ trước 32 core trong một SM chia thành 16 đơn vị load/store (LD/ST), và bốn đơn vị chức năng đặc biệt (SFU)

- 16 đơn vị LD/ST cho phép dữ liệu từ 16 luồng được nạp hoặc lưu trữ cùng một lúc từ bộ nhớ đệm hoặc DRAM

- SFU thực thi chỉ thị siêu việt như là sin, cosine, phản đề(reciprocal) và căn bậc 2 Mỗi SFU thực thi 1 chỉ thị trên 1 thread mỗi clock Nó được tách riêng ra từ

34 đơn vị điều phối (dispatch), cho phép đơn vị điều phối hỗ trợ những đơn vị thực thi khác trong khi SFU đang bị chiếm

Về mạch điều khiển logic, kiến trúc Fermi có một công nghệ mới gọi là GigaThread Thread Scheduler được thể hiện trong hình 3.5 Kiến trúc này là một bộ lập lịch phân tán 2 tầng giúp tăng thời gian chuyển ngữ cảnh và thực thi đồng thời Đầu tiên, tại mức chip, một bộ phân bố tải làm nhiệm vụ phân phối tải đến từng SM Sau đó, tại mỗi SM, mỗi nhóm luồng dữ liệu warp lại tiếp tục lập lịch để tăng thời gian lập lịch Thời gian chuyển đổi ngữ cảnh của kiến trúc Fermi được tối ưu đạt được dưới 25 micro giây Ngoài ra, kiến trúc Fermi còn cho phép nhiều nhân của cùng một ứng dụng được song song thực thi để tận dụng hết tài nguyên hệ thống Mỗi SM có 2 bộ lập lịch warp và 2 bộ phân phối tập lệnh riêng biệt, điều này, tương đương với 2 bộ lập lịch warp được tạo và thực thi song song như trong hình 3.6

Hình 3.6 - Hai bộ lập lịch dọc trong kiến trúc Fermi [17]

Kiến trúc Fermi thực hiện một hệ thống phân cấp memory như trong hình 3.7 với một register file, một L1 cache, a L2 cache, một shared memory và một global DRAM memory Register file bao gồm 32768 register 32 bit

Hình 3.7 - Hạ tầng bộ nhớ trong kiến trúc Fermi [17]

36 Kiến trúc Fermi là kiến trúc GPU đầu tiên với hệ thống phân cấp memory thật sự và một đường dẫn load/store thống nhất Tính năng này đảm bảo sự liên kết của data trong hệ thống phân cấp memory và cũng giúp giảm bớt những khó khăn của người lập trình trong việc xử lý memory Bên cạnh đó, thời gian truy cập memory giảm đáng kể nếu data được lưu trữ hiệu quả Hơn nữa, dung lượng shared memory và bộ nhớ L1 cache trong memory trên chip 64KB có thể được cấu hình tùy thuộc vào yêu cầu của ứng dụng Nếu ứng dụng cần một shared memory lớn, có thể sử dụng đến 48KB để chia sẻ data Mặt khác, khi không biết số lượng shared memory, có thể sử dụng 48KB bộ nhớ L1 cache để tăng tốc truy cập memory Tất cả các Fermi memory, từ bộ nhớ cache đến DRAM, được trang bị Error Correcting Code (ECC), nó có thể sửa lỗi single-bit trong mỗi lần truy cập data Bên cạnh đó, ECC cũng được cung cấp để phát hiện và báo cáo tất cả các lỗi multi-bit và double- bit để tăng độ chắc chắn của nó Cùng với ECC, kiến trúc Fermi cũng thống nhất không gian địa chỉ của các memory (được thể hiện trong hình 3.8) Tính năng này làm cho kiến trúc Fermi có thể hỗ trợ chương trình C++ có các biến truyền qua con trỏ

Hình 3.8 - Không gian địa chỉ hợp nhất của kiến trúc Fermi [17]

Kiến trúc Kepler là kiến trúc GPU của NVIDIA với mục đích tối ưu hiệu suất trên mỗi watt Nó được thiết kế với ba tính năng quan trọng là SMX, HyperQ và dynamic parallelism Những cải tiến này làm cải thiện hiệu suất (với hiệu quả energy cao hơn)

Những SM trong kiến trúc Kepler được gọi là những SMX để đạt được hiệu quả power Một đơn vị SMX mới gồm có 192 CUDA core, 32 đơn vị chức năng đặc biệt (SFU), 32 đơn vị load/store SMX có nhiều core hơn SM của Fermi (hình 3.9)

Mỗi core có thể hỗ trợ nhiều thread hơn Mỗi thread nó nhiều thanh ghi hơn Tất cả những đặc điểm này dẫn đến các đơn vị tính toán hiệu quả hơn Mặc dù sử dụng nhiều core hơn, nhưng SMX mới tiêu tốn ít energy hơn SM của kiến trúc Fermi khoảng 3 lần Đạt được những cải thiện này là nhờ thiết kế tiết kiệm năng lượng của kiến trúc vi mô, phần mềm và mức hệ thống

Hình 3.9 - Thiết kế SMX mới của kiến trúc Kepler [18] Để cải thiện hơn nữa hiệu năng của kiến trúc Kepler, HyperQ được thiết kế để queuing scheme thông minh hơn kiến trúc Fermi Sự khác nhau giữa hai kiến trúc này được minh họa trong hinh 3.10 Nếu kiến trúc Fermi chỉ có một work queue không thể giữ cho GPU làm việc mọi lúc thì kiến trúc Kepler có 32 work queue để thực hiện 32 bộ xử lý trên GPU cùng lúc Sự cải thiện này làm giảm thời gian nghỉ của GPU core, do đó làm tăng throughput thực thi các lệnh

Hình 3.10 - Cơ chế định thời HyperQ của kiến trúc Kepler [18]

Một công nghệ cải tiến nữa của kiến trúc Kepler là dynamic parallelism

CUDA framework

GPU được thiết kế để xử lý các ứng dụng data parallel như các ứng dụng đồ họa, parallelism hơn là CPU xử lý Tuy nhiên, CPU có nhiều mạch điều khiển logic phức tạp hơn, do đó CPU xử lý tốt các chương trình với các command điều kiện

Nói cách khác, có những nhiệm vụ phù hợp chạy trên CPU hơn và ngược lại Do đó, sẽ có lợi khi kết hợp GPU và CPU vào một platform thống nhất để chúng có thể hợp tác để đạt được hiệu suất tốt hơn CUDA framework được giới thiệu với một mục đích này

Trong một CUDA framework, CPU được xem như một host sẽ hợp tác với một hoặc nhiều thiết bị gọi là thiết bị CUDA Các thiết bị CUDA bao gồm rất nhiều đơn vị thực thi số học, nó có thể cung cấp khả năng xử lý song song

Một chương trình CUDA gồm có một hoặc nhiều phần có thể ánh xạ trên một host hoặc một thiết bị Những nhiệm vụ không có hoặc có ít data parallelism sẽ được thực hiện trên một host, trong khi nhiệm vụ song song sẽ được thực hiện trên các thiết bị như hình 3.14 Một chương trình CUDA là một unified source code, nó kết hợp cả host và device code Device code là chương trình được thực hiện từ phía host và dẫn ra kernel Kernel có thể hoạt động song song với một số lượng lớn các thread được gán cho nhiều core

Thiết bị CUDA được trang bị những memory riêng biệt với CPU memory trong cùng một platform Do đó, thiết bị phải phân bổ memory và truyền data từ host memory đến device memory Sau khi thực hiện một kernel, thiết bị chuyển data trở lại host memory và giải pháp memory để sử dụng tiếp

Một kernel là một function chỉ định chương trình để thực thi đồng thời bởi tất cả các thread

Chương trình kernel nên giống nhau cho tất cả thread nhưng hoạt động trên các data khác nhau để tạo ra kết quả cho một tính toán cụ thể

Việc thực thi kernel trên GPU được gán cho nhiều thread Các thread được tổ chức thành nhiều block có kích thước bằng nhau Nhiều block tạo ra một lưới Hình 3.15 là một ví dụ về cách các thread được tổ chức trong một mạng lưới Các block và các thread hoạt động trong không gian 3 chiều, do đó chúng được xác định bởi một chỉ số coordinated x, y, z

Hình 3.14 - Sơ đồ thứ tự khi chạy chương trình CUDA [22]

Các lập trình viên xác định số lượng block trên mạng lưới và số lượng của thread trên block bằng cách sử dụng một biến được xác định trước trong một lời gọi kernel Những thông số này ảnh hưởng đến hiệu quả của chương trình CUDA

Block ID và thread ID cũng có thể truy cập được bởi các built-invariable

Hình 3.15 - Một dạng phân chia 2 chiều của một Grid trong CUDA [22]

3.2.2 CUDA memory hierarchy and manipulation

Phân cấp memory thiết bị bao gồm constant memory, global memory, registers và shared memory như mô tả trong hình 3.16 Global memory và constant memory được sử dụng để giao tiếp với host memory và giữa các thiết bị Mỗi thread có register riêng của nó (local memory) mà không thể truy cập bằng thread khác

Shared memory được sử dụng bởi một số thread trong block Nó được truy cập nhanh hơn nhiều so với global memory, do đó càng nhiều dữ liệu càng tốt và nên phân bổ trên shared memory đầu tiên Tuy nhiên kích thước shared memory được giởi hạn ở mức tối đa là 48KB/block, không phải tất cả data có thể phân bổ trên

45 shared memory Những memory được phân loại là linear memory, để phân biệt với các loại memory khác như texture memory hoặc surface memory

Truy cập memory trong một chương trình CUDA được xử lý bởi các API funtion Ngoài các API này, phiên bản CUDA mới được trang bị các tính toán linh hoạt hơn với memory của thiết bị Để kiểm soát bộ nhớ cache L1 và L2 có thể ảnh hưởng đến hiệu suất ứng dụng, các CUDA function được cung cấp để cho phép lập trình viên kiểm soát việc sử dụng các bộ nhớ cache đó Một cache line dài 128 byte

Nếu data được lưu trữ trong bộ nhớ cache L1 và L2, memory access sẽ được truyền với 128 byte cho mỗi transaction Trong khi đó, memory access được lưu trữ trong L2 chỉ được chuyển với 32 byte cho mỗi transaction Theo mặc định, tất cả dữ liệu được lưu trữ qua bộ nhớ cache L1 và L2 Trong một số trường hợp, bộ nhớ cache L1 rất hữu ích để tăng hiệu suất của chương trình Tuy nhiên, nếu access pattern là phân tán, L1 cache làm tăng thời gian truy cập data Để vô hiệu hóa L1 cache, lập trình viên có thể sử dụng tùy chọn compiler Xptxasdlcm = cg [23]

Hình 3.16 - Tổng quan về bộ nhớ trong CUDA [22]

46 Truy cập vào shared memory nhanh hơn nhiều so với global/local memory, do đó, nhiều shared memory cho mỗi block có thể được ưu thích hơn trong một số trường hợp Ngoài kích thước mặc định của shared memory, số lượng shared memory cho mỗi block có thể được xác định bên trong lời gọi kernel Bên cạnh đó, bộ nhớ cache L1 chia sẻ cùng không gian memory trên chip với shared memory

Vì GPU được thiết kế cho các ứng dụng đồ họa bao gồm các tính toán trên các điểm ảnh Môi trường của một điểm ảnh rất phù hợp với đặc tính của nó Đặc tính này cũng cần thiết cho nhiều ứng dụng máy tính Để khai thác khả năng này, texture memory có thể tiếp cận trong CUDA framework Texture memory là memory chỉ đọc, có thể coi là con trỏ chỉ đọc đến vị trí global memory Texture memory hữu ích trong một số trường hợp khi bộ nhớ cache giới hạn memory access pattern và tăng cường hiệu năng Cache line được gọi là một tập hợp các vị trí memory liên tiếp Để nạp các vị trí lân cận như thể hiện trong hình 3.17 Một cache line thông thường cần ít nhất 3 tải Tuy nhiên, texture memory có thể sử dụng hệ thống phối hợp hai chiều để tải các vị trí memory đó trong một lần tải Trong CUDA framework, texture memory được cung cấp với 1D và 2D management

Kiểu data được hỗ trợ bao gồm integer và float (single-precision floating point - dấu chấm động với độ chính xác đơn) Double precision floating point (dấu chấm động với độ chính xác đôi) cũng khả thi bằng cách sử dụng kiểu int2 cùng với hàm hiloint2double() (nó chuyển đổi biến kiểu int2 thành biến kiểu double)

Hình 3.17 - Tải lên một partern của bộ nhớ ngữ cảnh

3.2.3 Exploit parallelism sử dụng CUDA

Trong một chương trình CUDA, có một số phương pháp để thực thi kernel đồng thời Ở cấp thiết bị, CUDA cung cấp cú pháp để gọi các kernel khác nhau từ một chương trình host Nếu platform có nhiều thiết bị GPU, những kernel có thể chạy song song trên các thiết bị và cuối cùng sẽ kết hợp kết quả trong chương trình host Ở cấp độ công việc, CUDA kernel khác nhau với stream ID khác nhau có thể thực thi song song trên cùng một thiết bị Cấu hình này được thực hiện bởi các lập trình viên Cấu hình này làm tăng việc sử dụng tài nguyên GPU nếu có đủ paralleism trong một ứng dụng

Ngoài concurrent execution, CUDA cũng cung cấp overlapped execution

Overlapped execution được thực hiện giữa các giao dịch memory và thực thi kernel bằng cách sử dụng asynchronous operations

Synchronization trong một chương trình ứng dụng máy tính là rất cần thiết

Model mapping trên GPU

Hình 3.18 - Mapping kernel đến GPU khi phần còn lại của chương trình đang chạy trên CPU

Một mô hình neuron là một tập hợp các phương trình thể hiện động lực bên trong của mỗi neuron Mô hình neuron trong thiết lập mạng thể hiện các hoạt động giữa nhiều neuron có tính chất thay đổi theo đầu vào và tương tác lẫn nhau Mô phỏng mạng neuron là tốn kém về mặt tính toán vì số lượng neuron ở một bước mô phỏng lên đến hàng ngàn neuron Bên cạnh đó, nếu chúng ta nhắm đến mục tiêu mô phỏng theo thời gian thực của đầu ra là cần thiết thì có thể dùng sau một khoảng thời gian ngắn khoảng vài mili giây Hơn nữa, số bước để mô phỏng mạng neuron là rất lớn, lên tới hàng trăm bước tùy thuộc vào quy mô của từng bước thời gian

49 May mắn thay, việc mô phỏng mạng neuron là một vấn đề nan giải vì mỗi neuron có thê được xem như một phần tử tính toán đơn lẻ, nó tính toán và giao tiếp với các phần tử khác thông qua memory access Do đó, ứng dụng này phù hợp để ánh xạ trên GPU platform So với mô phỏng tốn kém trên máy server, một GPU platform có thể cung cấp một platform rẻ hơn và đơn giản hơn cho vấn đề như vậy với hiệu quả cao Để làm điều đó, kernel là calculation có sẵn của các thuộc tính neuron nên được lấy ra như hình 3.18 Kernel này sẽ được ánh xạ trên nhiều thread CUDA riêng lẻ được thực hiện song song Kernel được phát hiện ở phần code chứa các vòng lặp lớn Code trong kernel nên tránh các câu lệnh điều kiện để việc thực hiện đơn giản cho tất cả các kernel và tránh sự chậm trễ để read các giá trị cập nhật giữa các kernel

Việc extraction kernel cũng nên quan tâm đến số lượng data cần thiết để truyền sang bên thiết bị Nếu một lượng lớn data cần truyền sang thiết bị, kích thước memory hạn chế và thời gian truy xuất memory lâu ở phía thiết bị có thể làm hãm việc tăng hiệu suất của chương trình song song Hơn nữa, overlapped execution giữa memory transaction và kernel execution có thể được coi như là một lựa chọn để giảm thời gian thực hiện Trong trường hợp memory transaction không làm hãm hiệu suất của ứng dụng, tối ưu hóa việc sử dụng memory là không hữu ích

Hiệu quả của việc ánh xạ mô hình trên GPU platform cũng bao gồm việc tối ưu hóa độ rộng băng thông của memory access Tất cả data trên thiết bị phải được phân tích để được gán một cách chính xác vào register, shared hoặc global memory

Khi truy cập global memory chậm hơn 300-400 lần so với truy cập shared memory, mẫu data thiết bị cần được phân bổ hiệu quả để sử dụng bộ nhớ cache hiệu quả

May mắn là GPU platform cung cấp nhiều giao thức read và write cho phép nhiều kernel read cùng một vị trí memory với băng thông cao Điều này giúp giảm bớt khó khăn trong việc thực hiện một phần và cũng cho thấy kết quả thực hiện đầy hứa hẹn

Texture memory cũng thích hợp để giảm thời gian truy cập memory

Memory này là memory chỉ read, tuy nhiên nhược điểm này có thể khắc phục bằng cách synchronization explicit Mỗi khi một kernel được nạp, texture memory sẽ được cache lại

Tesla C2075 platform có 4GB global memory và 48KB shared memory trên mỗi block Do đó, đối với tính toán với độ chính xác đôi (nghĩa là một biến kiểu double 8 byte được sử dụng), global memory và shared memory có thể chứa tương

50 ứng 524288 biến và 6144 biến Đối với độ chính xác đơn, số này tăng gấp đôi global data được sử dụng các host và thiết bị Còn shared data được sử dụng giữa các thread trên mỗi block nên sẽ ít hơn về số lượng Giải pháp tối ưu cho băng thông memory chỉ có thể đạt đượckhi phân đoạn giao dịch được căn chỉnh theo thứ tự 1, 2, 4, 8 hoặc 16 byte Hơn nữa, một line L1 cache là 128 byte, nó xác định vùng memory để phân bổ data trong global memory Nếu không, một lần truy cập sẽ được biên dịch thành nhiều lệnh với mẫu truy cập được xen kẽ mà không hợp nhất

Bên cạnh đó, việc sử dụng bộ nhớ cache L1 và L2 cũng có thể được xem xet trong trường hợp data bị phân tán và không thể lưu trữ được một cách hiệu quả hơn

Trong một số trường hợp, bộ nhớ L1 có thể bị vô hiệu hóa để giảm thời gian truy cập memory Platform này có một warp 32 thread với một bộ lập lịch hai chiều, do đó số lượng các thread trong một block nên là bội số của 32 để khai thác đầy đủ các nguồn lực của môt SM Một số nguyên cứu cho thấy kích thước block tối ưu trong kiến trúc Fermi là 2x128 hoặc 2x256 nơi cung cấp bộ nhớ cache tối thiểu bị miss và bộ nhớ cache tối đa đã occupancy

GeForce GT640 có 2GB global memory và 48KB shared memory cho mỗi block Do đó, data được ánh xạ tới global memory nên nhỏ gọn hơn so với Tesla platform Tuy nhiên, số lượng register cho mỗi block là 65536 gấp đôi so với Tesla platform Do đó, nhiều local memory có thể được sử dụng hoặc nhiều thread có thể được khởi tạo song song

Mô hình bài toán

Tế bào trám hành

Như đã đề cập ở chương 2, tiểu não là phần não đảm bảo yếu tố lực và thời gian cho dây thần kinh vận động, đồng thời liên quan đến việc học hỏi các kĩ năng vận động

Hình 4.1 - Sơ đồ mạch đơn giản của tiểu não

Tiểu não [24] có 2 đường dẫn truyền vào chính: thông qua các sợi rêu (MF) và sợi leo (CF) (hình 4.1) Sợi rêu sẽ thu thập tất cả các thông tin theo nội dung từ

52 các vùng khác của não bộ Sợi rêu thông qua sợi song song (PF) và cùng với sợi leo cung ứng các tín hiệu cho tế bào Purkinje (PC) Purkinje là tế bào duy nhất ngăn chặn các hoạt động không bmong muốn trong neuron ở hạt nhân nằm sâu trong tiểu não, giúp cho các tín hiệu đầu ra được đảm bảo chính xác Hoạt động “ngắt” của hạt nhân tiểu não tương tự như việc điêu khắc, những chi tiết dư thừa sẽ bị bỏ đi để tạo ra những chi tiết cần thiết Đó cũng là cách mà quá trình học hỏi các kĩ năng vận động diễn ra để có thể đưa ra các hành động chính xác [25] Trám hành là tế bào thần kinh duy nhất cung cấp dữ liệu đầu vào cho sợi leo, có vai trò quan trọng trong chức năng của tiểu não Do sợi leo có vai trò tính toán thời gian cho các lệnh vận động và học hỏi kĩ năng vận động, tổn thương trám hành (mất kết nối giữa trám hành và tiểu não) sẽ dẫn đến những vấn đề về vận động như chứng giật cầu mắt, mất điều hoà từ ngữ và rối loạn trương lực.

Mô hình trám hành (IO)

Hình 4.2 - Ba ngăn động lực học của tế bào IO [26]

53 Mô hình được minh hoạ trong luận văn này là mô hình IO được phát triển từ những nghiên cứu trước đây bởi Jornt R De Gruijl [26] Mô hình Hodgkin-Huxley được áp dụng vào mô hình này theo 3 khoang: sợi nhánh, tế bào soma và gò sợi trục Mỗi phần được mô phỏng dựa trên 3 tham số của độ dẫn: độ dẫn rò, độ dẫn natri và độ dẫn kali Mỗi độ dẫn này đều phụ thuộc vào số lượng tham số dòng điện Độ dẫn của sợi nhánh phụ thuộc vào ngưỡng cao của dòng canxi, dòng h và dòng kali phụ thuộc canxi Tham số soma phụ thuộc vào ngưỡng thấp của dòng canxi, dòng kali và dòng natri Tham số gò sợi trục phụ thuộc vào dòng natri và dòng kali

Mỗi phần cũng bao gồm dòng điện rò thụ động, lần lượt là Ild Ils Ila Phần động lực học trên đây của mô hình IO được trình bày trong hình 4.2 Bên trong mô hình IO, các phần đều có tương tác với nhau

Hình 4.3 - Mạng lưới trong tế bào IO

Nhiều tế bào trám hành liên kết với nhau sẽ tạo thành một mạng lưới IO Để đơn giản hoá phép tính trong mạng lưới IO, mạng lưới sẽ được coi như một mắt lưới 2D với 2 chiều không gian IO_NETWORK_DIM1 và IO_NETWORK_DIM2

Việc tính toán trong mỗi IO sẽ bao gồm cả việc tính toán các thuộc tính của 3 khoang trên như là về dòng điện hay điện áp Hình 4.3 là một minh hoạ cho mạng lưới IO Điện áp đầu vào bên ngoài sẽ được đưa vào khoang sợi nhánh của mỗi IO, và cũng là đầu vào từ CN (nhân tiểu não) Sự liên kết giữa các tế bào trong mạng lưới IO với nhau được thông qua cái được gọi là khoảng cách giữa các mối nối, nơi

54 mỗi tế bào có thế liên kết với 8 tế bào lân cận

Sự liên kết giữa các tế bào là kết quả của việc tiếp nhận toàn bộ các điện áp của sợi nhánh của các tế bào lân cận để tính toán thành điện áp sợi nhánh Phương trình cho khoảng cách các mối nối sẽ được bàn luận ở phần [26] Do mạng lưới IO là một mắt lưới 2D, cho nên các tế bào nằm ở góc sẽ chỉ có 3 tế bào lân cận thực và tế bào nằm ở phần rìa sẽ có 5 tế bào lân cận thực.

Hiện thực mô hình theo ngôn ngữ lập trình C

Để có thể minh hoạ mô hình trên máy tính, ban đầu mô hình được thực hiện trên phần mềm Matlab sau đó mới được Sebastian Isaza chuyển sang ngôn ngữ lập trình C

Trong mã nguồn C, luồng dữ liệu của chức năng chính được thể hiện trong hình 4.4, là nơi phân bổ các kí ức quan trọng, khởi chạy các trạng thái của mạng lưới, và điều hành các tham số tính toán

Hình 4.4 - Sơ đồ luồng dữ liệu

55 Chương trình sử dụng “struct” để thực hiện 2 cấu trúc dữ liệu trong mã code, như hình 4.5 Cấu trúc được gọi là CellState chứa 19 biến số kiểu double Những biến số này chính là các dòng ion và điện áp của 3 khoang đã được giải thích ở [26]

Một kiểu cấu trúc khác nữa là CellComParams chứa 54 biến số Kiểu cấu trúc CellComParams được sử dụng cho các đối số, các đối số được chuyển thành hàm để không ngừng tính toán các giá trị của 3 khoang nói trên Vì chúng ta cần phải lưu giữ cả trạng thái trước đó và tiếp theo của mỗi tế bào, cho nến số lượng dữ liệu lưu trữ trong kiểu cấu trúc CellState gấp đối số lượng của dữ liệu đầu vào

Hình 4.5 - Cấu trúc dữ liệu

Trong quá trình thực hiện ngôn ngữ C, có 2 biến số chính dưới dạng dãy số (CellStatrPtr và CellComParamsPtr như hình 4.5) Vì biến số trong CellStatePtr cần phải đủ lớn để lưu trữ cả trạng thái trước và tiếp theo, cho nên số lượng các biến số cần thiết trong CellComParamsPtr cần phải tương đương với số lượng của mạng IO

Hình 4.6 - Biến dữ liệu chính CellStatrPtr và CellComParamsPtr

Nhiệm vụ chính được thể hiện trong hình 4.6 bắt đầu với việc gán các giá trị tiền định cho các trạng thái của tế bào, hay cũng chính là dãy biến số CellStatePtr

Như đã giải thích trước đó, các dòng điện bên ngoài được đưa vào bên trong khoang sợi nhánh ngay từ giai đoạn đầu của mỗi bước nhảy thời gian Do đó, dữ liệu đầu vào từ bên ngoài được nhận biết như một dãy giá trị vào tại mỗi bước nhảy thời gian Và cũng từ đó, cần có chỉ số bước nhảy thời gian để xác định vị trí các giá trị đúng của dữ liệu đầu vào bên ngoài Sau khi khởi chạy các trạng thái tế bào và truyền dữ liệu vào, mỗi tế bào IO được tính toán từng cái một và cập nhật các trạng thái mới sau mỗi bước nhảy thời gian

Như đã giải thích trước đó, mỗi một tế bào được liên kết với 8 tế bào lân cận

Trong quá trình thực hiện này, mỗi liên kết là kết quả của việc thu nhận điện áp sợi nhánh của các tế bào lân cận và lưu trữ trong một dãy số nhất định Tuy nhiên, để làm cho việc điền đầy đủ các biến vào dãy số được dễ dàng, số lượng các tế bào lân cận cần phải ngang bằng nhau Chính vì thế, mỗi tế bào được cho là luôn luôn có 8 tế bào lân cận Các tế bào lân cận của tế bào nằm ở góc và rìa bị thiếu sẽ được điền vào bằng giá trị của chính tế bào đó

Quá trình thực hiện ngôn ngữ C trong hình 4.5 bao gồm một vòng lặp phân chia theo bước nhảy thời gian và 2 vòng lặp liên hệ với 2 chiều không gian của mạng lưới IO (IO_NETWORK_DM1 và IO_NETWORK_DM2) Phần tính toán có

57 chiều sâu của chương trình được đặt tại sự mô phỏng của 3 vòng lặp này Thông tin này rất cần thiết trong việc song song hoá chương trình sau này

Hàm ComputeOneCell (trình bày trong hình 4.7) tính toán tất cả các tham số sợi nhánh, soma và sợi trục Hàm này sẽ yêu cầu 3 hàm phụ khác để thực hiện các tính toán số học bằng việc sử dụng phương trình ở phần [26] 3 hàm này thực hiện ở trạng thái trước của tế bào IO và các dữ liệu đầu vào bên ngoài, do đó chúng có thể được điểu khiển song song với nhau

Hình 4.7 - Hàm ComputeOneCell mô phỏng 1 neuron

Hiện thực mô hình dùng CUDA framework

Chuyển đổi tính toán tuần tự sang tính toán song song

Theo cách phân tích trên, việc hiện thực mô hình bằng ngôn ngữ CUDA được trình bày theo hình 5.1 sau:

Hình 5.1 - Hiện thực mô hình bằng ngôn ngữ CUDA

Cấu trúc chương trình Biến dữ liệu

Thông số mạng neuron tại 2 bước mô phỏng liên tiếp

Kích thước: 2 x 19 x kích thước mạng mô phỏng dev_CellStateTmp

Kích thước: 2 x 19 x kích thước mạng mô phỏng loop < sim_steps iApp

Giá trị tín hiệu vào tại mỗi bước mô phỏng

Kích thước: 2 x 19 x kích thước mạng mô phỏng dev_CellComParamTmps

Kích thước: 2 x 54 x kích thước mạng mô phỏng

Kết thúc Truyền dữ liệu từ

GPU sang CPU Khởi tạo mạng neuron

Truyền dữ liệu từ CPU sang GPU

Lấy thông số tính toán + Trạng thái neuron + Tín hiệu từ các neuron xung quanh

Tính toán trạng thái neuron

60 Chương trình được khởi tạo bằng việc tạo ra các Input (dòng Iapp), các trạng thái ban đầu của neuron và các hằng số về độ dẫn Kali, Natri, Canxi

Truyền dữ liệu từ CPU sang GPU: sử dụng API của CUDA cudaMemCpy(

, , , cudaMemcpyHostToDevice) sau khi khởi tạo, thông qua hàm trên sẽ được sao chép sang biến Chỉ thị “cudaMemcpyHostToDevice” thông báo cho compiler rằng luồng dữ liệu đi từ bộ nhớ CPU sang bộ nhớ GPU

Lúc này, mọi tính toán đều được thực hiện trên bộ nhớ và các thread của GPU

Các biến dev_CellStateTmp và dev_CellComParamTmps sẽ được tính toán và cập nhật lần lượt tương ứng với từng neuron trong mạng

Mỗi bước mô phỏng (sim_step) sẽ tính lại trạng thái của toàn bộ neuron trong mạng, làm cơ sở để tính toán cho các bước mô phỏng tiếp theo

Sau khi GPU thực hiện xong tất cả các bước mô phỏng, dữ liệu sẽ được đưa về CPU để hậu xử lý (tính toán thời gian xử lý, in kết quả ra màn hình ) Để truyền dữ liệu từ GPU sang CPU, ta sử dụng API của CUDA cudaMemCpy( ,

, , cudaMemcpyDeviceToHost) Chỉ thị

“cudaMemcpyDeviceToHost” thông báo cho compiler rằng luồng dữ liệu đi từ bộ nhớ GPU sang bộ nhớ CPU.

Chia lưới tính toán trên GPU sử dụng CUDA framework

Mạng neuron cần mô phỏng được chia thành lưới 2 chiều, mỗi neuron tương ứng với một CUDA thread, nhiều thread tạo thành một block, nhiều block tạo thành một grid, là đơn vị phân chia cao nhất của CUDA framework Mô hình chia lưới mạng neuron có dạng như hình 5.2 dưới đây:

Hình 5.2 - Mô hình chia lưới tính toán

Hoạt động tính toán trên lưới được thực hiện như sau

+ Phân chia block đến từng SM, mỗi SM có thể xử lý nhiều block cùng lúc, nếu có nhiều block đến SM thì các block này sẽ được lập lịch để xử lý tuần tự

+ Tại mỗi SM, các block sẽ được chia thành từng bó warp, mỗi bó warp có 32 thread, mỗi thread được phân tới một nhân CUDA để thực thi Quá trình thực thi của thread trong bó warp theo dạng SIMT nên không cần cơ chế đồng bộ, tức là các thread chạy cùng tập lệnh và kết thúc cùng lúc

CUDA framework hỗ trợ từ khóa > để cài đặt các thông số tính toán, trong chương trình mô phỏng, từ khóa trên được sử dụng ở 2 chương trình con ở bảng sau dim3 blockDim(BLOCKSIZEX, BLOCKSIZEY); dim3 gridDim(IO_NETWORK_DIM1/blockDim.x, IO_NETWORK_DIM2/blockDim.y);

62 neighbor_kernel >(dev_cellStatePtr, dev_cellVDendPtr); compute_kernel >(dev_cellStatePtr, dev_iApp, dev_cellVDendPtr);

Biến blockDim phân chia mạng neuron thành các block có kích thước (BLOCKSIZEX x BLOCKSIZEY ), kích thước block có thể thay đổi tùy chọn như (4x4, 8x8, 16x16, …) tuy nhiên không được vượt quá giới hạn phần cứng (GPU 1080Ti hỗ trợ tối đa 1024)

Biến gridDim xác định kích thước lưới dựa vào kích thước mạng neuron cần mô phỏng, giới hạn của gridDim rất lớn (GPU 1080Ti hỗ trợ tối đa 2147483647x65535x65535), kích thước mạng neuron mô phỏng sẽ bị chặn bởi các giới hạn khác trước khi đạt được giới hạn này

Phần tính toán song song gồm 2 chương trình chính là:

+ neighbor_kernel cập nhật trạng thái cell hiện tại dựa vào trạng thái cell ở vòng lặp trước và trạng thái cell xong quanh

+ compute_kernel tính toán trạng thái mới của cell

Chương trình neighbor_kernel thực hiện các bước liên quan đến copy dữ liệu còn chương trình compute_kernel thực hiện các phép tính Việc phân chia này nhằm mục đích để dễ dàng xác định thời gian thực thi của từng phần riêng biệt, từ đó có các phương pháp tối ưu hợp lý.

Chuyển đổi quản lý bộ nhớ chương trình từ GPU sang CPU

GPU sử dụng bộ nhớ riêng biệt độc lập với CPU, trong chương trình C các biến được khởi tạo từ bộ nhớ CPU, do đó, trong chương trình CUDA, cần thêm bước copy biến từ bộ nhớ CPU sang bộ nhớ GPU trước khi thực hiện tính toán

Việc copy lượng lớn dữ liệu từ CPU sang GPU có thể gây ra hiện tượng thắt cổ chai do hạn chế về tốc độ của bus phần cứng kết nối giữa CPU và GPU

Sau khi phân tích việc sử dụng các biến trong chương trình, việc chuyển đổi quản lý bộ nhớ được đề xuất như sau

Tín hiệu đầu vào mô phỏng dev_iApp tại tất cả các bước thời gian được khởi tạo từ CPU và copy sang GPU một lần duy nhất lúc bắt đầu chương trình, các quá

63 trình tính toán sau này hoàn toàn sử dụng bộ nhớ GPU nhằm giảm bước điều khiển lấy dev_iApp tại mỗi bước lặp mô phỏng

Biến dev_cellVDendPtr lưu trữ giá trị đầu vào các sợi trục xung quanh neuron được chuyển sang lưu trữ dưới dạng dữ liệu riêng của CUDA là texture2D Kiểu dữ liệu texture2D trong CUDA giúp việc truy cập dữ liệu theo chỉ số 2 chiều nhanh hơn Ngoài ra, các gía trị biên của mảng dữ liệu texture2D cũng được tự động gán giá trị thích hợp, từ đó giảm được phần code kiểu tra điều kiện khi lấy các giá trị xung quanh.

Xác định số thứ tự neuron trong lưới

Theo cách phân chia lưới 2D ở mục 5.2, số thứ tự 2 chiều của mỗi neuron trong CUDA framework được tính theo công thức sau k = blockIdx.x*blockDim.x + threadIdx.x; j = blockIdx.y*blockDim.y + threadIdx.y;

Các biến (blockIdx.x, blockIdx.y) - số thứ tự của block và (threadIdx.x, threadIdx.y) - số thứ tự của thread là các biến built-in trong CUDA framework

Liên hệ giữa các biến built-in này và 2 biến cấu hình lúc chia lưới > được thể hình ở hình 5.3 sau:

Hình 5.3 - Mô hình lưới CUDA 2D theo blockDim và threadDim

Phân tích thời gian tính toán trên GPU

CUDA framework hỗ trợ công cụ “nvprof” để tính toán thời gian thực hiện các function trên GPU Bảng dưới đây tổng hợp thời gian tính toán trên GPU với kích thước mạng neuron 64x64

Time(%) Time Calls Avg Min Max Name GPU activities: 89.73% 1.55991s 30000 51.997us 48.961us 2.4223ms compute_kernel(float*, float*, float*)

10.26% 178.31ms 30000 5.9430us 5.6640us 283.56us neighbor_kernel(float*, float*)

0.01% 95.874us 1 95.874us 95.874us 95.874us [CUDA memcpy DtoH]

0.00% 73.889us 3 24.629us 2.2080us 54.561us [CUDA memcpy HtoD]

Thấp nhất (us) Cao nhất (us) Tên hàm gọi

Bảng 5.1 - Phân tích thời gian tính toán với độ chính xác đơn

Cao nhất (us) Tên hàm gọi

Bảng 5.2 - Phân tích thời gian tính toán với độ chính xác kép

Tối ưu giải thuật

5.6.1 Thông tin cấu hình GPU GTX 1080Ti

CUDA framework hỗ trợ hàm cudaGetDeviceProperties() để lấy các thông số của GPU Sử dụng hàm này, ta lấy được thông số của GPU GTX 1080Ti như sau

CUDA Driver Version / Runtime Version 9.1 / 9.1 CUDA Capability Major/Minor version number: 6.1

Total amount of global memory: 11177 MBytes

(11720130560 bytes) (28) Multiprocessors, (128) CUDA Cores/MP: 3584 CUDA Cores GPU Max Clock rate: 1645 MHz (1.64 GHz)

Memory Clock rate: 5505 Mhz Memory Bus Width: 352-bit L2 Cache Size: 2883584 bytes Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)

Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers

Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers

Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 65536

Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)

Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes

Concurrent copy and kernel execution: Yes with 2 copy engine(s)

Run time limit on kernels: Yes Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled Device supports Unified Addressing (UVA): Yes Supports Cooperative Kernel Launch: Yes Supports MultiDevice Co-op Kernel Launch: Yes Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0

Dựa vào thông tin cấu hình của GPU 1080Ti, có số lượng SM là 28, ta xác định được số lượng thread tối đa là 28x128584, từ đó xác định được kích thước tối đa mạng neuron có thể mô phỏng là 3584 phần tử, vượt quá con số này phải chuyển qua tính toán tuần tự trên từng cụm 3584 phần tử

5.6.2 Lựa chọn kích thước block trong lưới mô phỏng

Như đã trình bày ở mục 5.2, các block được Phân chia đến từng SM, mỗi SM có thể xử lý nhiều block cùng lúc, nếu có nhiều block đến SM thì các block này sẽ được lập lịch để xử lý tuần tự Kích thước block sẽ ảnh hưởng đến quá trình copy chuyển dữ liệu và số lượng block cần lên lịch

Bảng 5.3 và hình 5.4 sau đây tổng hợp thời gian tính toán theo kích thước block khác nhau trên mạng neuron kích thước 512x512:

Kích thước block Số phần tử Thời gian mô phỏng

(giây) compute_kernel (giây) neighbor_kernel (giây)

Bảng 5.3 - Thời gian mô phỏng theo kích thước block khác nhau

Hình 5.4 - Thời gian mô phỏng của mỗi chương trình con theo block size

Như đã trình bày ở mục 5.1 và 5.2, chương trình mô phỏng gồm 2 chương trình con conpute_kernel và neighbor_kernel, lần lượt thực hiện chức năng tính toán và copy dữ liệu Hình 5.2 thể hiện thời gian tính toán của mỗi chương trình con thay đổi theo kích thước block

Với kích thước block nhỏ (< 4x4 phần tử), thời gian chạy chương trình neighbor_kernel ngắn, khi kích thước block tăng lên, thời gian chạy cũng tăng lên, với kích thước block lớn hơn 8x8d phần tử, thời gian chạy có giảm nhưng không nhiều Đối với hàm compute_kernel, với kích thước block < 32, thời gian chạy giảm rất lớn, với kích thước > 32 phần tử, thời gian chạy lại tăng trở lại

Kích thước block compute_kernel neighbor_kernel

Hình 5.5 - Thời gian mô phỏng theo kích thước block

Theo kết quả mô phỏng, ta nhận thấy kích thước block 4x82 phần tử có thời gian mô phỏng tối ưu, kết hợp được thời gian tính toán tối ưu của chương trình con compute_kernel và thời gian chạy copy dữ liệu đạt ngưỡng ổn định

Phần chi tiết tính toán cho việc lựa chọn kích thước block sẽ được bàn kỹ hơn trong chương 6

5.6.3 Tính toán sử dụng số thực float16

GPU Pascal hỗ trợ tính toán theo số thực 16 bit, định dạng của số thực này tuân theo chuẩn IEEE 754-2008 như hình 5.6 dưới đây:

Hình 5.6 - Định dạng số float16 theo chuẩn IEE 754-2008

CUDA framework hỗ trợ định dạng dữ liệu float16 và các phép toán liên quan như sau:

Từ khóa kiểu dữ liệu Giải thích half Khai báo kiểu dữ liệu half, là số float16 half2 Khai báo kiểu dữ liệu half2, là 2 số float16 được đóng gói trong một số biến, là đầu vào của các hàm tính toán trên cùng lúc 2 số float16

68 Kiến trúc PGU Pascal hỗ trợ tính toán trên số thực float16, có thể tăng tốc độ tính toán lên gấp đôi so với float32 đồng thời gian kích thước bộ nhớ lưu dữ liệu

Việc sử dụng số thực float16 có thể theo 3 phương pháp (a), (b), (c) trên hình 5.7:

Hình 5.7 - Các phương pháp sử dụng số thực float16

Phương pháp (a) chỉ giúp giảm kích thước dữ liệu cần lưu trữ, các bước tính toán phải có bước chuyển đổi từ float16 sang float32 và ngược lại, như vậy, so với tính toán trực tiếp trên float32 thì kết quả còn chậm hơn

Phương pháp (b) không yêu cầu chuyển đổi float16 sang float32 nên có tốc độ tính toán như trên số thực float32

Phương pháp (c) thực hiện việc ghép 2 số float 16 vào một số float32 rồi thực hiện tính toán 1 lần, cách làm này cho phép tăng tốc độ tính toán lên gấp đôi so với float32 Để đạt được kết quả tối ưu trên float16 trên GPU Pascal, ta sử dụng phương pháp (c), quá trình tối ưu float16 gồm các bước như sau:

+ Phân tích mã nguồn tính toán mô phỏng, tìm kiếm các cặp phép toán giống nhau có thể tính toán trên số half2, CUDA framework hỗ trợ hầu hết các phép toán thông thương trên số half2

+ Đóng gói các cặp phép toán giống nhau tìm cách đóng gói 2 biến float16 vào 1 biến float32 và sử dụng tập lệnh chuyên biệt trên GPU Pascal để thực hiện 2 phép tính trên 2 số float16 cùng lúc

+ Chuyển đổi kết quả đóng gói tách 2 số float16 sang số float32 để tiếp tục tính toán

Ví dụ: tính toán hệ số tau_q theo float16

69 Trong chương tình mô phỏng, hàm dev_DendHCurr tính toán hệ số tau_q theo công thức sau

Trong công thức trên ta nhận thấy có cặp phép tính giống nhau là và

Cặp phép tính này có thể đóng gói thành số half2 h5 để thực hiện tính toán đồng thời

Số h5 được tính toán bằng cách thực hiện hàm mũ e trong CUDA framework h2exp() trên số half2 h4 được đóng gói như sau:

Tương tự, số h4 được tính toán bằng hàm nhân và cộng 3 số half2 h1, h2, h3 (CUDA function hfma2(h1, h2, h3) như sau:

Chi tiết về mã nguồn chuyển đổi được thực hiện như sau:

//tau_q = 1 /(expf(-0.086 * prevV_dend - 14.6) + expf(0.070 * prevV_dend - 1.87)); h1 = floats2half2_rn(-0.086, 0.070); h2 = floats2half2_rn(- 14.6, - 1.87); h3 = floats2half2_rn(prevV_dend, prevV_dend); h4 = hfma2(h1, h3, h2); h5 = h2exp(h4); f1 = half22float2(h5); tau_q = 1/f1.x + f1.y;

Việc chuyển đổi từ số half2 lấy 2 giá trị float để tiếp tục thực hiện tính toán thông thường được hỗ trợ bởi hàm CUDA float2 f1= half22float2(h5), với giá trị

70 trả về được lưu trong struct float2 gồm 2 biến float là f1.x và f1.y, giá trị biến tau_q lúc này được tính theo phép tính số float32 thông thường:

5.6.4 Tính toán sử dụng SFU trên GPU

Chương trình mô phỏng neuron sử dụng rất nhiều tính toán liên quan đến hàm mũ exp và cặp phép toán nhân và cộng 3 biến GPU có sẵn các SFU hỗ trợ giúp thực hiện các hàm trên nhanh chóng

Thống kê số lượng hàm SFU dùng để tối ưu chương trình tính toán trên mỗi neuron như sau

Tên hàm SFU Số lần gọi Giải thích

expf (a) 35 Hàm mũ e trên số float

fmaf_rn(a, b, c) 14 Hàm nhân và cộng 3 số float a*b+c fdividef(a,b) 9 Hàm chia xấp xỉ 2 số float a/b

Kết quả thực nghiệm

Kết quả mô phỏng

Chương trình mô phỏng được chạy thử nghiệm trên card màn hình GTX 1080Ti Ngoài ra, chương trình tính toán trên CPU được chạy trên CPU core i7 7700 – 2.8 GHz quad-core để kiểm tra kết quả và so sánh

Các giá trị ban đầu được thiết lập giống nhau ở các lần thử nghiệm Cụ thể như sau, tín hiệu kích thích đầu vào có dạng xung vuông, thời gian mô phỏng 1.5 giây, bước nhảy 0.05 giây, tương ứng tổng số bước mô phỏng là 30000 Các thông số kích thước mạng neuron và kích thước chia khối block được thay đổi nhằm đánh giá và tối ưu chương trình

Kích thước mạng neuron được đề xuất là:

• 4194304 (2048x2048) Kích thước chia khối block được đề xuất là:

• 1024 (32x32) – Tối đa hỗ trợ bởi GTX 1080Ti

6.1.1 Mô phỏng đáp ứng xung

Tín hiệu đầu vào Iapp được biểu diễn như sau: tại mỗi bước mô phỏng, Iapp được gán giá trị 0, chỉ có duy nhất tại bước mô phỏng thứ 10000 đến 10500, Iapp được gán giá trị bằng 6A Mục đích của việc gán giá trị này là để mô phỏng việc một neuron khi ở trạng thái bình thường, dòng Iapp có giá trị 0 (tức là không có kích thích)

Ngược lại, khi neuron nhận được kích thích từ các neuron xung quanh, đồng nghĩa với việc nó nhận được một dòng điện kích thích, cũng tức là nó được báo hiệu cần phải chuyển xử lý và tiếp tín hiệu đó đi

Vì lý do mô tả ở trên, tín hiệu đầu vào Iapp có dạng xung vuông như hình 6.1 dưới đây:

Hình 6.1 - Tín hiệu xung đầu vào

Tín hiệu điện áp đầu ra Vaxon được lấy mẫu tại vị trí trung tâm của lưới, hình 6.2 dưới đây thể hiện giá trị điện áp này với tín hiệu đầu vào có dạng xung vuông như hình 6.1

Hình 6.2 - Tín hiệu V axon đầu vào

Chúng ta có thể dễ dàng nhận thấy, tại thời điểm bình thường (chưa có kích thích), Vaxon có giá trị dao động quanh -57V đến -60V, điều này được lý giải là do khi chưa có kích thích, các khe hở tại các khoang giữa Dendrite – Soma và Soma – Axon đóng vai trò như các tụ điện, chúng nạp xả liên tục do chênh lệch điện áp giữa các dòng ion bên trong và bên ngoài tế bào neuron, sự chênh lệch này không đủ để tụ điện bắn ra một dòng điện lớn như khi có kích thích Còn tại thời điểm mô phỏng gần bước 10000 (vị trí mà neuron nhận được kích thích Iapp = 6A) Vaxon đột ngột tạo ra một điện thế tầm +60V, là do các tụ điện nói ở trên được nạp đủ điện nhanh chóng, điện thế giữa hai bản của tụ điện đủ để phóng ra một dòng điện đi theo chiều từ Dendrite đến Axon Hillock, sau đó được lan truyền đi, tiếp tục tới các neuron xung quanh Sau giai đoạn phóng điện này, điện tích trên các bản của tụ điện được phóng hết, tụ điện cần một thời gian để nạp lại dần các chênh lệch điện áp được tạo ra bởi các ion (trong và ngoài tế bào), giai đoạn này gọi là giai đoạn trơ ì của neuron Khi các ion được cân bằng tại hai bản của tụ điện, chúng tại lại nhận được giai đoạn dao động của điện thế giữa hai bản tụ điện, dĩ nhiên phải sau một vài lần nạp xả nhỏ nữa, điện thế tại Axon mới trở về trạng thái dao động thường thấy (giống như hiện tượng ném viên đá xuống mặt nước hồ)

Chương trình mô phỏng với 2 tùy chọn tính toán độ chính xác đơn (float32) và độ chính xác kép (float64) khi so sánh với chương trình chạy trên CPU đều cho kết quả đáp ứng giống nhau Chi tiết về kết quả thời gian tính toán được trình bày ở các phần tiếp theo sau đây

6.1.2 Thời gian mô phỏng trên CPU

Trên CPU, chương trình mô phỏng được chạy với 2 tùy chọn sử dụng độ chính xác đơn float32 và độ chính xác kép float64, bảng 6.1 dưới đây tổng hợp kết quả chạy mô phỏng với kích thước mạng neuron khác nhau

Bảng 6.1 - Thời gian chạy mô phỏng trên CPU core i7 – 2.8 GHz

Từ bảng 6.1 ta thấy thời gian tính toán độ chính xác kép lâu hơn độ chính xác đơn khoảng 50% Với giá trị thời gian thực đặt ra ban đầu là 1.5 giây thì việc thực thi trên CPU chưa đạt yêu cầu Thậm chí với thời gian tính toán kích thước lớn nhất 4194304 (2048x2048) thì thời gian thực thi rất lâu: với độ chính xác đơn là 1.47 ngày, độ chính xác kép là 2.1 ngày

Hình 6.3 - Thời gian tính toán trên CPU theo kích thước mạng neuron

6.1.3 Thời gian mô phỏng trên GPU 1080Ti với block size khác nhau

Việc chọn lựa kích thước block là rất quan trọng trong việc mô phỏng Với các kích thước đã được đề xuất, ta có kết quả mô phỏng như sau (với độ chính xác đơn float32):

Bảng 6.2 - Thời gian tính toán trên GTX 1080Ti với các block size khác nhau

Hình 6.4 - So sánh thời gian xử lý trên GTX 1080Ti với các block size khác nhau

Block size 4Block size 8Block size 16Block size 32Block size 64Block size 128Block size 256Block size 512Block size 1024

76 Từ kết quả trên có thể nhận thấy kích thước 32 thread/block cho kết quả tính toán tốt nhất (634.93 giây với kích thước lớn nhất 2048x2048), tức là hiệu năng tốt nhất Với cùng kích thước đầu vào, thời gian thực thi tăng lên khi tăng kích thước block Đặc biệt kích thước block càng về gần bằng 1 thì thời gian thực thi tăng lên đáng kể (kích thước block bằng 4 và 8)

Với kích thước cell network nhỏ, sự khác biệt giữa các kết quả không quá lớn với tất cả các block size Sự khác biệt tăng lên khi kích thước cell network ngày càng tăng Điều này được lý giải là do sự chiếm dụng SM của kích thước cell nhỏ là thấp cho tất cả các kích thước block, hay nói cách khác, số lượng đầu vào của cell network không đủ lớn để điền vào tất cả các SM

Việc kết quả tính toán trên kích thước block 32 tốt nhất cũng có thể được giải thích bằng việc GPU 1080Ti có kích thước warp bằng 32, do đó kích thước block này cũng tương ứng với số thread tối đa trên mỗi warp, giúp hạn chế việc định thời warp – khiến cho các tác vụ phải đợi nhau

Vì những lý do trên, đề xuất chọn số liệu tính toán của kích thước block bằng 32 để so sánh cho các tính toán sau đây

6.1.4 Thời gian mô phỏng trên GPU 1080Ti với độ chính xác khác nhau

Ta cần đưa ra một so sánh tính toán giữa độ chính xác đơn float32 và độ chính xác kép float64 (hay double) thực hiện trên GPU 1080Ti

Kết quả tính toán nhận được theo bảng sau:

Kích thước cell network GPU float32 (giây) GPU float64 (giây)

Bảng 6.3 - Kết quả tính toán với độ chính xác đơn và kép trên GTX 1080Ti

Hình 6.5 - So sánh kết quả tính toán trên GTX 1080Ti với độ chính xác khác nhau

Dựa vào bảng số liệu 6.3 Và hình vẽ minh họa 6.5, Ta thấy rằng cùng tương tự như CPU, kết quả tính toán độ chính xác đơn float32 trên GPU 1080Ti nhanh gấp 1.5 lần sao với độ chính xác kép float64 trên GPU này

Vì việc tính toán của chúng ta không cần sử dụng tới độ chính xác kép, nên các kết quả tiếp theo sẽ xem xét trên độ chính xác đơn float32

6.1.5 So sánh thời gian mô phỏng trên GPU float32 với CPU float32

Kích thước cell network CPU (giây) GPU float32 (giây) Tăng tốc (lần)

Bảng 6.4 - So sánh tốc độ của GTX 1080Ti vsà CPU core i7 2.8GHz

Kích thước cell network float32 float64

Hình 6.6 - So sánh tốc độ GTX 1080Ti và CPU core i7 2.8GHZ

Dựa vào bảng 6.4 và hình vẽ mô tả 6.6, ta thấy thời gian tăng tốc tốt nhất là ở kích thước block 16384 (128x128) và kém nhất ở kích thước block 64 (8x8)

Tăng tốc độ trung bình là 125.76 lần

6.1.6 So sánh thời gian mô phỏng trên GPU float32 với cải tiến giải thuật

Kích thước cell network GPU float32 (giây) GPU cải tiến (giây) Tăng tốc (%)

Bảng 6.5 - So sánh tốc độ giữa GPU float32 và sau khi cải thiện thuật toán

Kích thước cell network float32

Hình 6.7 - So sánh tốc độ giữa GPU float 32 và sau khi cải thiện thuật toán

Dựa vào bảng 6.5 và hình vẽ mô tả 6.7, ta thấy thời gian tăng tốc tốt nhất là ở kích thước block 64 (8x8) và kém nhất ở kích thước block 4096 (64x64)

Tăng tốc độ trung bình là 20%

6.1.7 So sánh thời gian mô phỏng trên CPU float32 với cải tiến giải thuật

Kích thước Cell network CPU (giây) GPU cải tiến (giây) Tăng tốc (lần)

Bảng 6.6 - So sánh tốc độ giữa CPU float 32 và GPU cải thiện thuật toán

Hình 6.8 - So sánh tốc độ giữa CPU float 32 và GPU cải thiện thuật toán

Dựa vào bảng 6.6 và hình vẽ mô tả 6.8, ta thấy thời gian tăng tốc tốt nhất là ở kích thước block 16384 (128x128) và kém nhất ở kích thước block 64 (8x8)

Tăng tốc độ trung bình là 154.25 lần.

Kết luận

Luận văn cung cấp cho người đọc tổng quan về lĩnh vực Neuromorphic Computing, những khó khăn và cách giải quyết trong quá trình mô phỏng mô hình SNN Cụ thể trong luận văn này, tác giả đã đề xuất giải thuật để thực hiện việc mô phỏng mạng IO trên nền tảng GPU Đồng thời, so sánh kết quả thu được của giải thuật khi chạy trên CPU

Kết quả tính toán trên số thực đơn float32 và số thực kép float64 là giống nhau, với các tính toán mô phỏng mạng neuron, có thể sử dụng số thực đơn để giảm thời gian cũng như kích thước dữ liệu tính toán

Trong tính toán sử dụng số thực đơn, kích thước mạng neuron tối đa 64 x 64 4096 đáp ứng được yêu cầu thời gian thực (thời gian chạy chương trình tương đương thời gian mô phỏng)

81 Bằng cách sử dụng các phương pháp tối ưu như sử dụng tính toán trên float16, sử dụng SFU để thực hiên phép toán chuyên biệt, thời gian mô phỏng có thể giảm được 20%, từ đó tăng kích thước mạng neuron tối đa có thể cho đáp ứng thời gian thực

Trong phạm vi luận văn này, yếu tố kích thước cell network theo không gian 3 chiều chưa được cân nhắc xem xét để mô phỏng cho giống với cấu trúc neuron ngoài đời thực Vì vậy trong tương lai cần triển khai các mô hình và thuật toán để có thể đưa ra sự mô phỏng chính xác hơn nữa Các mô hình và giải thuật cho không gian 3 chiều sẽ được áp dụng trong các nghiên cứu tiếp theo để có nhiều cải tiến hơn nữa

Ngày đăng: 09/09/2024, 00:14

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[2] E. Izhikevich, "Which model to use for cortical spiking neurons," in Neural Networks, IEEE Transactions on, vol. 15, no. 5, 2004, p. 1063 – 1070 Sách, tạp chí
Tiêu đề: Which model to use for cortical spiking neurons
[3] Khronos, "Opencl-open standard for parallel programming of heterugeneous systems," December 2012. [Online]. Available:http://www.khronos.org/opencl/ Sách, tạp chí
Tiêu đề: Opencl-open standard for parallel programming of heterugeneous systems
[4] V. Pallipuram, M. Bhuiyan, and M. Smith, "Evaluation of gpu architectures using spiking neural networks," in Application Accelerators in High- Performance Computing (SAAHPC), 2011, p. 93 –102 Sách, tạp chí
Tiêu đề: Evaluation of gpu architectures using spiking neural networks
[5] A. Fidjeland and M. Shanahan, "Accelerated simulation of spiking neural networks using gpus," in Neural Networks (IJCNN), The 2010 International Joint Conference, July 2010, p. 1 – 8 Sách, tạp chí
Tiêu đề: Accelerated simulation of spiking neural networks using gpus
[6] D. Yudanov, M. Shaaban, R. Melton, and L. Reznik, "Gpu-based simulation of spiking neural networks with real-time performance amp; high accuracy," in Neural Networks (IJCNN), The 2010 International Joint Conference, July 2010, pp. 1 - 8 Sách, tạp chí
Tiêu đề: Gpu-based simulation of spiking neural networks with real-time performance amp; high accuracy
[9] A. L. HODGKIN and A. F. HUXLEY, "A quantitative description of membrane current and its application to conduction and excitation in nerve.,"The Journal of physiology, vol. 117, no. 4, August 1952. [Online]. Available:http://jp.physoc.org/content/117/4/500.abstract Sách, tạp chí
Tiêu đề: A quantitative description of membrane current and its application to conduction and excitation in nerve
[11] H. Lecar, "Morris-lecar model," February 2013. [Online]. Available: http://www. scholarpedia.org/article/Morris-Lecar_model Sách, tạp chí
Tiêu đề: Morris-lecar model
[12] H. R. Wilson, "Simplified dynamics of human and mammalian neocortical neurons," in J. Theo: Biol, vol. 200, 1999, p. 375 – 388 Sách, tạp chí
Tiêu đề: Simplified dynamics of human and mammalian neocortical neurons
[14] E. Izhikevich, "Simple model of spiking neurons," in Neural Networks, IEEE Transactions on, vol. 14, no. 6, November 2003, p. 1569 – 1572 Sách, tạp chí
Tiêu đề: Simple model of spiking neurons
[18] NVIDIA, "Kepler white paper," 2012. [Online]. Available: http://www.nvidia.com/object/ nvidia-kepler.html Sách, tạp chí
Tiêu đề: Kepler white paper
[19] "Dynamic parallelism white paper," 2012. [Online]. Available: http://developer.download.nvidia.com/assets/cuda/docs/TechBrief_Dynamic_Parallelism_in_CUDA_v2.pdf Sách, tạp chí
Tiêu đề: Dynamic parallelism white paper
[20] M. Harris, "5 Things You Should Know About the New Maxwell GPU Architecture," February 2014. [Online]. Available:https://devblogs.nvidia.com/5-things-you-should-know-about-new-maxwell-gpu-architecture/ Sách, tạp chí
Tiêu đề: 5 Things You Should Know About the New Maxwell GPU Architecture
[24] Wikipedia, "Cerebellum," November 2011. [Online]. Available: http://en.wikipedia.org/wiki/Cerebellum Sách, tạp chí
Tiêu đề: Cerebellum
[25] R. Swenson, "Cerebellar systems," 2006. [Online]. Available: http://www.dartmouth.edu/∼rswenson/NeuroSci/chapter 8B.html Sách, tạp chí
Tiêu đề: Cerebellar systems
[26] J. R. De Gruijl, P. Bazzigaluppi, M. T. G. de Jeu, and C. I. De Zeeuw, "Climbing fiber burst size and olivary sub-threshold oscillations in a network setting," PLoS Comput Biol, vol. 8, no. 12, p. e1002814, 12 2012. [Online] Sách, tạp chí
Tiêu đề: Climbing fiber burst size and olivary sub-threshold oscillations in a network setting
[1] W. Gerstner and W. M. Kistler, Spiking Neuron Models: Single Neurons, Populations, Plasticity. Cambridge University Press Khác
[7] T. J. Eric Kandel, James Schwartz, Principles of Neural Science, McGraw-Hill Companies, Incorporated Khác
[8] M. A.Arbib, The Handbook of Brain Theory and Neural Networks. The MIT Press Khác
[10] N. Corson and M. Aziz-Alaoui, Dynamics and complexity of hindmarsh-rose neuronal sys- tems Khác
[15] G. F. Lyle N. Long, A review of biologically plausible neuron models for spiking neural networks, Aerospace Conference, April 2010 Khác

HÌNH ẢNH LIÊN QUAN

Hình 2.1 - Cấu tạo của bộ não người [7] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 2.1 Cấu tạo của bộ não người [7] (Trang 16)
Hình 2.5 - Sơ đồ kênh ion và màng tế bào của mô hình Hodgkin-Huxley [8] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 2.5 Sơ đồ kênh ion và màng tế bào của mô hình Hodgkin-Huxley [8] (Trang 25)
Hình 2.6 - Mô hình neuron multi-compartment [1] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 2.6 Mô hình neuron multi-compartment [1] (Trang 29)
Hình 2.7 - Tỉ lệ spiking của các mô hình neuron [15] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 2.7 Tỉ lệ spiking của các mô hình neuron [15] (Trang 32)
Hình 2.8 - Xấp xỉ số lượng phép tính floating point dùng để mô phỏng trong 1ms - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 2.8 Xấp xỉ số lượng phép tính floating point dùng để mô phỏng trong 1ms (Trang 33)
Hình 3.2 - Kiến trúc của Fermi 16 SM [17] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.2 Kiến trúc của Fermi 16 SM [17] (Trang 38)
Hình 3.3 - Cấu trúc của Fermi Streaming Multiprocessor (SM) [17] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.3 Cấu trúc của Fermi Streaming Multiprocessor (SM) [17] (Trang 39)
Hình 3.7 - Hạ tầng bộ nhớ trong kiến trúc Fermi [17] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.7 Hạ tầng bộ nhớ trong kiến trúc Fermi [17] (Trang 42)
Hình 3.10 - Cơ chế định thời HyperQ của kiến trúc Kepler [18] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.10 Cơ chế định thời HyperQ của kiến trúc Kepler [18] (Trang 45)
Hình 3.12 - Cải tiến SM của kiến trúc Maxwell [20] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.12 Cải tiến SM của kiến trúc Maxwell [20] (Trang 46)
Hình 3.13 - Cơ chế NVLink của kiến trúc Pascal [21] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.13 Cơ chế NVLink của kiến trúc Pascal [21] (Trang 47)
Hình 3.14 - Sơ đồ thứ tự khi chạy chương trình CUDA [22] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.14 Sơ đồ thứ tự khi chạy chương trình CUDA [22] (Trang 50)
Hình 3.15 - Một dạng phân chia 2 chiều của một Grid trong CUDA [22] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.15 Một dạng phân chia 2 chiều của một Grid trong CUDA [22] (Trang 51)
Hình 3.16 - Tổng quan về bộ nhớ trong CUDA [22] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.16 Tổng quan về bộ nhớ trong CUDA [22] (Trang 52)
Hình 3.17 - Tải lên một partern của bộ nhớ ngữ cảnh - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.17 Tải lên một partern của bộ nhớ ngữ cảnh (Trang 53)
Hình 3.18 - Mapping kernel đến GPU khi phần còn lại của chương trình - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 3.18 Mapping kernel đến GPU khi phần còn lại của chương trình (Trang 55)
Hình 4.1 - Sơ đồ mạch đơn giản của tiểu não - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 4.1 Sơ đồ mạch đơn giản của tiểu não (Trang 58)
Hình 4.2 - Ba ngăn động lực học của tế bào IO [26] - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 4.2 Ba ngăn động lực học của tế bào IO [26] (Trang 59)
Hình 4.3 - Mạng lưới trong tế bào IO - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 4.3 Mạng lưới trong tế bào IO (Trang 60)
Hình 4.4 - Sơ đồ luồng dữ liệu - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 4.4 Sơ đồ luồng dữ liệu (Trang 61)
Hình 4.6 - Biến dữ liệu chính CellStatrPtr và CellComParamsPtr - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 4.6 Biến dữ liệu chính CellStatrPtr và CellComParamsPtr (Trang 63)
Bảng 5.3 - Thời gian mô phỏng theo kích thước block khác nhau - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Bảng 5.3 Thời gian mô phỏng theo kích thước block khác nhau (Trang 73)
Hình 5.5 - Thời gian mô phỏng theo kích thước block - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 5.5 Thời gian mô phỏng theo kích thước block (Trang 74)
Hình 5.7 - Các phương pháp sử dụng số thực float16 - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 5.7 Các phương pháp sử dụng số thực float16 (Trang 75)
Hình 6.2 - Tín hiệu V axon  đầu vào - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 6.2 Tín hiệu V axon đầu vào (Trang 80)
Hình 6.5 - So sánh kết quả tính toán trên GTX 1080Ti với độ chính xác khác nhau - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 6.5 So sánh kết quả tính toán trên GTX 1080Ti với độ chính xác khác nhau (Trang 84)
Hình 6.6 - So sánh tốc độ GTX 1080Ti và CPU core i7 2.8GHZ - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 6.6 So sánh tốc độ GTX 1080Ti và CPU core i7 2.8GHZ (Trang 85)
Hình 6.7 - So sánh tốc độ giữa GPU float 32 và sau khi cải thiện thuật toán - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 6.7 So sánh tốc độ giữa GPU float 32 và sau khi cải thiện thuật toán (Trang 86)
Hình 6.8 - So sánh tốc độ giữa CPU float 32 và GPU cải thiện thuật toán - Luận văn thạc sĩ Khoa học máy tính: Neuromorphic computing trên nền tảng CPU
Hình 6.8 So sánh tốc độ giữa CPU float 32 và GPU cải thiện thuật toán (Trang 87)
w