- vừa được xem lúc

[Lập trình song song] Bài bonus 1: Cách thức hoạt động của máy tính

0 0 19

Người đăng: NgoHuuGiaHuy

Theo Viblo Asia

Ở bài này mình sẽ nói qua về cách máy tính hoạt động trong việc lấy và xử lí data qua ví dụ cực kì trực quan và dễ hiểu 😀. Và xin lưu ý là ví dụ này sẽ được nhắc lại khá nhiều trong các bài học về lập trình song song nên mong các bạn đọc kĩ

Read-Write data

Ví dụ :

Giả sử các bạn có 1024 cái bánh và có 32 đứa trẻ đang xếp hàng đợi để lên nhận bánh. Thì ở đây có 2 cách để các bạn phát bánh. image.png

Cách 1: đứa trẻ thứ nhất lên nhận bánh thì bạn phát 1 lần 32 cái bánh, tiếp đến đứa trẻ thứ 2 lên nhận bánh thì bạn lại tiếp tục phát 32 cái bánh trong 1 lần và cứ vậy cho đến khi đứa trẻ thứ 32 lên nhận phần bánh cuối cùng của mình ( 32 cái bánh)

Cách 2: đứa trẻ thứ nhất lên nhận bánh nhưng lần này bạn chỉ đưa 1 cái bánh cho đứa trẻ đó và kêu đứa trẻ đó quay về cuối hàng đợi cho lần phát tiếp theo. Đứa trẻ thứ 2 cũng tương tự, khi nhận được 1 cái bánh xong cũng quay về cuối hàng đợi và vòng lặp này cứ lặp đi lặp lại 32 lần cho đến khi cái bánh cuối cùng ( cái thứ 1024) được phát cho bạn thứ 32 ở vòng lặp thứ 32 thì mới thôi.

Ở đây theo logic bình thường thì hiển nhiên chúng ta đều đồng ý cách 1 nhanh hơn cách 2 nhiều NHƯNG đối với máy tính thì cách 2 lại nhanh hơn. Đừng lo vì tiếp theo đây mình sẽ phân tích lý do tại sao máy tính lại chọn cách 2.

Phân tích ví dụ:

Ở đây các miếng bánh là data chúng ta cần xử lí và các bạn trẻ là người xử lí data đó ( và chúng ta có thể xem các bạn trẻ như là các SM, đừng hoang mang nếu các bạn không biết SM là gì vì những bài sau mình sẽ giải thích, hiện giờ các bạn chỉ cần hiểu các bạn trẻ là người xử lí data là được rùi).

Có 2 điểm có thể các bạn quên về việc máy tính "handle data" là:

  1. Sau khi máy tính xử lí xong data này mới xử lí data tiếp theo chứ không thể cùng xử lí các data tại 1 thời điểm.
  2. Các data đang được xử lí không thể xử lí tại chỗ nó được Read mà phải copy data đó qua 1 khu vực memory nào đó để xử lí

Phân tích cách 1

=> Tức là ở ví dụ của chúng ta khi đứa trẻ thứ nhất lên nhận bánh thì đứa trẻ đó phải mang cái bánh ra chỗ khác rồi mới ngồi ăn, và khi ăn xong cái bánh thứ nhất thì mới quay lại nhận tiếp cái bánh thứ 2 rồi lại mang ra chỗ khác để ăn(chứ không thể cùng lúc ăn 32 cái bánh được)....Việc này lặp đi lặp lại 32 lần và trong thời điểm đó 31 đứa trẻ còn lại phải ngồi đợi đứa trẻ thứ nhất ăn hết ==> Các bạn có thể hình dung là đứa trẻ thứ 32 phải đợi bao lâu để tới lượt mình được ăn rùi chứ hả 😃

Một điểm trừ nữa về cách 1 là máy tính phải thêm 1 bước tính toán ( tức là ở đây bạn phải tính nên phát cho mỗi đứa trẻ bao nhiêu cái bánh) ở đây phép tính này không ảnh hưởng mấy nhưng sẽ gây ra 1 vấn đề là nếu số bánh không chia hết cho các đứa trẻ thì sao. Giả sử nếu chúng ta có 1055 cái bánh (1024 +31) thì lúc này đơn giản là 31 đứa trẻ xử lí 33 cái bánh (32+1) và 1 đứa trẻ còn lại xử lí 32 cái bánh ==> Nếu vậy thì quá tuyệt vời NHƯNG mỗi đứa trẻ chỉ xử lí tối đa 32 cái bánh ( còn lý do tại sao thì ở những bài sau mình sẽ giải thích) nên lúc này chúng ta sẽ có vòng lặp và đứa trẻ thứ nhất phải xử lí 1 mình 31 cái bánh bị lẻ

Phân tích cách 2

Ở đây khi đứa trẻ thứ nhất lên nhận 1 cái bánh xong quay về hàng chờ và đợi đến lượt của mình nhận tiếp cái bánh thứ 2 thì thời gian đó đứa trẻ sẽ ăn cái bánh thứ nhất==> chúng ta đã giải quyết được vấn đề là: 31 đứa trẻ còn lại không phải đợi đứa trẻ đầu tiên xử lí cái bánh mà đứa trẻ thứ 2 có thể lên "Read" data của mình ( cái bánh ) và xử lí cái bánh ấy khi ngồi chờ xếp hàng ==> tức là ở đây thay vì các đứa trẻ phải đợi nhau ăn xong phần bánh của mình ở cách 1 ( xử lí tuần tự-sequence) thì ở cách 2 các đứa trẻ có thể xử lí data mà không cần phải đợi nhau ( gần như song song-parallel).

Và 1 điểm cộng nữa là ở cách 2 không cần phải tính toán nên nếu gặp trường hợp 1055 cái bánh (1024+31) thì ở cách 1 thay vì để một mình đứa trẻ thứ 1 phải xử lí hết 31 cái bánh thì ở cách 2 chúng ta đã chia 31 cái bánh bị lẻ cho 31 bạn cùng xử lí

Qua phân tích chúng ta có thể thấy cách 2 đã được khéo léo xử lí data 1 cách gần như song song trong khi cách 1 thì tuần tự và đó cũng chính là cách mà chúng ta sẽ code trong việc xử lí song song

Bài viết đến đây là kết thúc, hi vọng các bạn đều hiểu ví dụ trên vì nó sẽ được đề cập lại nhiều lần ở các bài học sau này.

Bình luận

Bài viết tương tự

- vừa được xem lúc

GPU programming với Golang

GPU programming với Golang. Ở bài trước mình có giới thiệu về kĩ thuật lập trình GPU với OpenCL bằng C/C++.

0 0 27

- vừa được xem lúc

Allocating Memory on HPC ( Slurm Scripts)

Bài viết này giải thích cách yêu cầu bộ nhớ trong các Slurm Scripts và cách xử lý các lỗi thường gặp liên quan đến bộ nhớ CPU và GPU. Lưu ý rằng "memory" luôn đề cập đến RAM .

0 0 27

- vừa được xem lúc

[Lập trình song song] Bài 1: Giới thiệu về CPU-GPU

Trước khi tìm hiểu thế nào là lập trình song song cũng như cách code thì mình phải biết 1 chút về lịch sử hình thành nên ở bài 1 mình sẽ giới thiệu sơ lược những điều bạn nên biết ở lĩnh vực này. Chắc

0 0 28

- vừa được xem lúc

[Lập trình song song] Bài 2: Cài đặt môi trường code CudaC

Trước khi code thì chúng ta phải setup môi trường để code thì ở bài này mình sẽ hướng dẫn các bạn cách setup và đối với những ai sở hữu máy tính mà không có GPU thì cũng đừng có lo vì chúng ta sẽ code

0 0 18

- vừa được xem lúc

[Lập trình song song] Bài bonus 2: Các thuật ngữ trong lập trình song song

Ở bài này mình sẽ giải thích các thuật ngữ thường hay được đề cập tới trong lập trình song song. .

0 0 23

- vừa được xem lúc

[Lập trình song song] Bài 3: Hello world cuda-C

Ở các bài trước chúng ta đã học quá nhiều lý thuyết rùi, nên ở bài này chúng ta sẽ bắt đầu code những dòng đầu tiên bằng ngôn ngữ cuda-C và 1 lần nữa nếu máy tính các bạn không có GPU thì không sao cả

0 0 25