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

[Lập trình song song] Bài 13: Shared memory

0 0 8

Người đăng: CisMine

Theo Viblo Asia

Ở bài viết này mình sẽ giới thiệu các bạn cách dùng shared memory trên GPU bằng cuda, trước khi đọc bài viết này thì hãy xem qua bài viết Các bộ nhớ trong GPU

Shared memory

Shared memory là memory nhanh nhất ( chỉ sau register file ) trong GPU và phạm vi truy cập của shared memory là các thread trong 1 cùng block

Mỗi khi copy data từ global --> shared chúng ta phải syncthread để đồng bộ các threads trong cùng 1 block để tránh race conditionalwhile threads in a block run logically in parallel, not all threads can execute physically at the same time. ( có thể hiểu là các thread không khởi chạy cùng 1 thời điểm dẫn đến sẽ có 1 số thread xong trước, vậy nên cần syncthread )

Các bạn có thể tham khảo lại 2 bài này để hiểu rõ hơn: Data Hazard + Synchronization - Asynchronization

Đây là quy trình data đi từ global --> shared

Ở bài viết này mình chỉ tập trung vào khái niệm cũng như cách dùng shared memory, ở những bài sau mình sẽ chỉ những kĩ thuật giúp cải thiện cũng như tối ưu khi dùng shared memory

Code

Chúng ta đã quá quen với khái niệm static - dynamic memory thì ở shared memory chúng ta cũng có

__global__ void staticReverse(int *data, int n)
{ __shared__ int s[64]; int t = threadIdx.x; int tr = n-t-1; s[t] = data[t]; __syncthreads(); data[t] = s[tr];
}
__global__ void dynamicReverse(int *data, int n)
{ extern __shared__ int s[]; int t = threadIdx.x; int tr = n-t-1; s[t] = data[t]; __syncthreads(); data[t] = s[tr];
} 

Ở đây bài toán của chúng ta có 2 bước là:

  1. copy data từ global sang shared theo thứ tự bé đến lớn
  2. copy data từ shared về lại global theo thứ tự từ lớn đến bé
 staticReverse<<<1,n>>>(d_data, n); dynamicReverse<<<1,n,n*sizeof(int)>>>(d_data, n);

<<<a,b,c,d>>> lần lượt là:

  • a: số block
  • b: số thread trong 1 block
  • c: kích thước của shared memory
  • d: số streaming

code mình sẽ để ở đâ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 1: Cách thức hoạt động của máy tính

Ở 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

0 0 19

- 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