Tôi có hạt nhân đơn giản:OpenCL vô hướng vs vector
__kernel vecadd(__global const float *A,
__global const float *B,
__global float *C)
{
int idx = get_global_id(0);
C[idx] = A[idx] + B[idx];
}
Tại sao khi tôi thay đổi phao để float4, kernel chạy chậm hơn 30%?
Tất cả các hướng dẫn nói, rằng việc sử dụng các loại vector tăng tốc độ tính toán ...
Về phía chủ nhà, bộ nhớ alocated cho các đối số float4 là 16 byte liên kết và global_work_size cho clEnqueueNDRangeKernel nhỏ 4 lần.
Hạt nhân chạy trên GPU AMD HD5770, AMD-APP-SDK-v2.6.
thông tin thiết bị cho CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT trả 4.
EDIT:
global_work_size = 1024 * 1024 (và hơn)
local_work_size = 256
Thời gian đo bằng CL_PROFILING_COMMAND_START và CL_PROFILING_COMMAND_END.
Đối với global_work_size nhỏ hơn (8196 cho float/2048 cho float4), phiên bản vectơ nhanh hơn, nhưng tôi muốn biết, tại sao?
Giá trị công việc toàn cầu và kích thước nhóm làm việc là gì? Bạn đo thời gian nào và làm cách nào? –
kích thước công việc toàn cục = 1024 * 1024 kích thước công việc cục bộ = 256, tôi đo thời gian của clEnquueNDRangeKernel bằng CL_PROFILING_COMMAND_START và CL_PROFILING_COMMAND_END. Đối với global_work_size nhỏ hơn (8196 cho float/2048 cho float4), phiên bản vectơ nhanh hơn, nhưng tôi muốn biết, tại sao? – ldanko
Sự khác biệt giữa kích thước công việc nhỏ hơn và lớn hơn có thể do bộ nhớ cache không đổi của bạn. Vì vậy, 2 câu hỏi: 1) nếu bạn loại bỏ const, nó vẫn còn nhanh hơn cho nhỏ và chậm hơn cho lớn? 2) nếu bạn đi đâu đó giữa chừng, nói 65536 cho phao và 16384 cho float4, điều gì xảy ra sau đó? – user1111929