Tôi đã đọc bài viết Tối ưu hóa giảm song song trong CUDA bởi Mark Harris, và tôi thấy nó thực sự rất hữu ích, nhưng tôi vẫn thỉnh thoảng không thể hiểu được 1 hoặc 2 khái niệm. Nó được viết trên pg 18:Giảm song song
//First add during load
// each thread loads one element from global to shared mem
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
sdata[tid] = g_idata[i];
__syncthreads();
Tối ưu hóa Code: Với 2 tải và add 1 của giảm:
// perform first level of reduction,
// reading from global memory, writing to shared memory
unsigned int tid = threadIdx.x; ...1
unsigned int i = blockIdx.x*(blockDim.x*2) + threadIdx.x; ...2
sdata[tid] = g_idata[i] + g_idata[i+blockDim.x]; ...3
__syncthreads(); ...4
Tôi không thể hiểu được dòng 2; nếu tôi có 256 phần tử, và nếu tôi chọn 128 là khối của tôi, thì tại sao tôi nhân nó với 2? Xin giải thích làm thế nào để xác định các khối?
Cảm ơn bạn đã trả lời. Tôi đang cố gắng hiểu giải pháp, nhưng nếu bạn có thể cho tôi biết tổng số yếu tố là gì; và có bao nhiêu phần tử được xử lý cho mỗi khối? Ngoài ra nếu bạn có thể cho tôi biết, ban đầu chúng tôi đã xử lý các yếu tố với 4 khối và bây giờ cùng một số yếu tố nhưng với 2 khối? – robot
: H tại sao mỗi chuỗi sẽ chỉ tính toán 2 phần tử? Vì có tổng cộng 16 phần tử và 4 luồng/khối, 2 luồng của mỗi khối sẽ tính 4 phần tử. – robot
Cảm ơn bạn đã trả lời. Nếu mỗi luồng của 2 khối đầu tiên sẽ tính 2 phần tử, thì mỗi chuỗi cho 2 khối cuối cùng sẽ làm gì? – robot