Nhiệm vụ rất đơn giản, writting một seqence của biến số nguyên để nhớ:Cách nhanh chóng (est) để viết một seqence của số nguyên để bộ nhớ toàn cầu?
đang Original:
for (size_t i=0; i<1000*1000*1000; ++i)
{
data[i]=i;
};
đang song song:
size_t stepsize=len/N;
#pragma omp parallel num_threads(N)
{
int threadIdx=omp_get_thread_num();
size_t istart=stepsize*threadIdx;
size_t iend=threadIdx==N-1?len:istart+stepsize;
#pragma simd
for (size_t i=istart; i<iend; ++i)
x[i]=i;
};
Việc thực hiện sucks, phải mất 1,6 giây để viết 1G uint64
biến (bằng 5 GB mỗi giây), bằng cách song song đơn giản (open mp parallel
) của mã trên, tốc độ tăng chút, nhưng hiệu suất vẫn sucks, mất 1,4 giây với 4 chủ đề và 1,35 với 6 chủ đề trên i7 3970.
Các theortical băng thông bộ nhớ của giàn khoan của tôi (i7 3970/64g DDR3-1600) là 51,2 GB/sec, đối với ví dụ trên, băng thông bộ nhớ đạt được chỉ bằng khoảng 1/10 của băng thông lý thuyết, thậm chí thông qua ứng dụng là khá nhiều băng thông bộ nhớ bị giới hạn.
Bất kỳ ai biết cách cải thiện mã?
Tôi đã viết rất nhiều mã bộ nhớ bị ràng buộc trên GPU, khá dễ dàng để GPU tận dụng tối đa băng thông bộ nhớ của thiết bị GPU (ví dụ: 85% + băng thông lý thuyết).
EDIT:
Mã này được biên soạn bởi Intel ICC 13.1, đến 64bit nhị phân, và với Optimzation tối đa (O3) và đường dẫn mã AVX trên, cũng như tự động vectorization.
UPDATE:
Tôi đã thử tất cả các mã dưới đây (nhờ Paul R), không có gì đặc biệt xảy ra, tôi tin rằng trình biên dịch là hoàn toàn có khả năng làm các loại tối ưu hóa SIMD/vector hóa.
Đối với lý do tại sao tôi muốn lấp đầy những con số đó, tốt, câu chuyện dài ngắn:
phần của nó một hiệu suất cao máy tính không đồng nhất algorthim, ở phía bên thiết bị, algorthim rất hiệu quả đến mức độ mà bộ đa GPU quá nhanh đến mức tôi thấy sự tắc nghẽn hiệu suất xảy ra khi CPU cố gắng viết một vài số lượng seqence của các số vào bộ nhớ.
Trong số nguyên nhân, biết CPU mà hút tại điền số (ngược lại, GPU có thể điền seqence số với tốc độ rất gần (238GB/sec ra khỏi 288GB/sec trên GK110 vs một 5GB thảm hại/sec trong số 51.2GB/sec trên CPU) với băng thông lý thuyết của bộ nhớ toàn cầu của GPU), tôi có thể thay đổi algorthim của mình một chút, nhưng điều khiến tôi tự hỏi là tại sao CPU lại quá tệ khi lấp đầy số lượng ở đây.
Đối với băng thông bộ nhớ của giàn khoan của tôi, tôi tin rằng băng thông (51.2GB) là về đúng, dựa trên thử nghiệm memcpy()
tôi, băng thông đạt khoảng 80% + của băng thông theoritical (> 40GB/giây).
Bạn đã thử tối ưu hóa mã chưa? Ví dụ. sử dụng -O3 nếu bạn đang sử dụng 'gcc'? –
Tối thiểu, bạn nên thử mở nó ra. * Tối ưu hóa ghế bành *. – unwind
Thử thực hiện 2 lần viết mỗi lần lặp. Có lẽ 4, 8, 16. –