Câu hỏi liên quan

+1 Phiếu
3 Câu trả lời
0 Phiếu
5 Câu trả lời

Tại sao là bằng văn bản đến bộ nhớ chậm hơn nhiều so với đọc nó?


0 Phiếu
Đã hỏi 25/5/2016 bởi Coholink (180 điểm)
Dưới đây là một chuẩn mực băng thông đơn giản memset:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
    unsigned long n, r, i;
    unsigned char *p;
    clock_t c0, c1;
    double elapsed;
    n = 1000 * 1000 * 1000; /* GB */
    r = 100; /* repeat */
    p = calloc(n, 1);
    c0 = clock();
    for(i = 0; i < r; ++i) {
        memset(p, (int)i, n);
        printf("%4d/%4ld\\r", p[0], r); /* "use" the result */
        fflush(stdout);
    }
    c1 = clock();
    elapsed = (c1 - c0) / (double)CLOCKS_PER_SEC;
    printf("Bandwidth = %6.3f GB/s (Giga = 10^9)\\n", (double)n * r / elapsed / 1e9);
    free(p);
}
trên system của tôi (chi tiết bên dưới) với một DDR3 duy nhất - 1600, nó xuất ra: băng thông
= 4.751 GB/s (Giga = 10 ^ 9)
đây là 37% của tốc độ lý thuyết RAM: ce703edeb0f3318 240 c856d5716f4788 mặt khác, đây là một thử nghiệm tương tự như "đọc":
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
unsigned long do_xor(const unsigned long* p, unsigned long n)
{
    unsigned long i, x = 0;
    for(i = 0; i < n; ++i)
        x ^= p[i];
    return x;
}
int main()
{
    unsigned long n, r, i;
    unsigned long *p;
    clock_t c0, c1;
    double elapsed;
    n = 1000 * 1000 * 1000; /* GB */
    r = 100; /* repeat */
    p = calloc(n/sizeof(unsigned long), sizeof(unsigned long));
    c0 = clock();
    for(i = 0; i < r; ++i) {
        p[0] = do_xor(p, n / sizeof(unsigned long)); /* "use" the result */
        printf("%4ld/%4ld\\r", i, r);
        fflush(stdout);
    }
    c1 = clock();
    elapsed = (c1 - c0) / (double)CLOCKS_PER_SEC;
    printf("Bandwidth = %6.3f GB/s (Giga = 10^9)\\n", (double)n * r / elapsed / 1e9);
    free(p);
}
nó xuất ra: băng thông
= 11.516 GB/s (Giga = 10 ^ 9)
tôi có thể nhận được gần với giới hạn lý thuyết cho đọc hiệu suất , chẳng hạn như XORing một mảng lớn, nhưng văn bản xuất hiện để chậm hơn nhiều. Tại sao? OS 14,04 cho Ubuntu AMD64 (tôi compile với gcc -O3. Bằng cách sử dụng -O3 -march=native làm cho hiệu suất đọc hơi nặng hơn, nhưng không ảnh hưởng đến memset) CPU Xeon E5 - 2630 v2 RAM A single "16GB PC3 - 12800 tương đương REG CL11 240-Pin DIMM" (những gì nó nói trên hộp) tôi nghĩ rằng có một DIMM duy nhất làm cho hiệu suất hơn dự đoán. Tôi giả định rằng với 4 DIMMs, memset sẽ có lên đến 4 lần nhanh hơn. Bo mạch chủ Supermicro X9DRG -QF (hỗ trợ bộ nhớ kênh-4) thêm system : một máy tính xách tay với 2 x 4GB của DDR3 - 1067 RAM: đọc và ghi đều về 5,5 GB/s, nhưng lưu ý rằng nó sử dụng 2 DIMMs. PS thay thế memset với phiên bản này kết quả trong chính xác hiệu suất cùng
void *my_memset(void *s, int c, size_t n)
{
    unsigned long i = 0;
    for(i = 0; i < n; ++i)
        ((char*)s)[i] = (char)c;
    return s;
}

3 Câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi Genco4737 (530 điểm)
 
Câu trả lời hay nhất
Nó có thể là như thế nào nó (the-hệ thống-như-một-toàn bộ) thực hiện. Đọc là nhanh hơn dường như là một xu hướng phổ biến với một loạt các của hiệu suất tương đối thông qua. Trên một nhanh chóng phân tích DDR3 Intel và DDR2 trong bảng xếp hạng liệt kê, như một vài trường hợp chọn (write/read)% ; Một số hoạt động đầu trang DDR3 chip đang viết khoảng ~ 60-70% thông qua đọc. Tuy nhiên, có một số module bộ nhớ (tức là. Đế chế vàng CL11 -13-13 D3-2666) xuống chỉ ~ 30% viết. Hàng đầu thực hiện DDR2 chip dường như đã chỉ có khoảng ~ 50% thông qua viết so với đọc. Nhưng cũng có một số đối thủ đáng chú ý là xấu (tức là. OCZ OCZ21066NEW _ BT1G) xuống ~ 20%. Trong khi điều này không thể giải thích nguyên cho ~ 40% ghi/đọc báo cáo, như là điểm chuẩn code và cài đặt sử dụng có thể khác nhau (các ghi chú là mơ hồ ), điều này chắc chắn là một yếu tố . (Tôi muốn chạy một số chương trình chuẩn hiện tại và xem nếu số mùa thu trong-line với những người trong code đăng trong câu hỏi.) Cập Nhật
: tôi tải về table nhìn lên bộ nhớ từ các trang web được liên kết và xử lý trong Excel. Trong khi nó vẫn cho thấy một loạt các của các giá trị đó là ít hơn nhiều sever so với ban đầu trả lời ở trên mà chỉ nhìn vào bộ nhớ đọc trên chip và một vài mục đã chọn "thú vị" từ các bảng xếp hạng. Tôi không chắc chắn sự khác biệt, đặc biệt là trong khủng khiếp contenders chỉ ra ở trên, từ đâu đến. Tuy nhiên, ngay cả dưới vẫn còn khoảng từ 50%-100 % (trung bình 65, nghĩa là 65) hiệu suất đọc. Lưu ý rằng chỉ vì một con chip này "100 %" hiệu quả theo tỉ lệ ghi/đọc không có nghĩa là nó đã tốt hơn tổng thể... chỉ cần rằng nó đã hơn thậm chí-keel giữa hai hoạt động.
Đã bình luận 05/6/2016 bởi range_try (820 điểm)
'printf ("%4d/%4ld\\r", p [0], r);' trong của bạn có nghĩa là chuẩn mực bạn đang rất có thể thời gian đó chứ không phải bất cứ điều gì khác. I/O là chậm.
Đã bình luận 06/6/2016 bởi bjaKucan (200 điểm)
@ RetiredNinja không! 'printf' là thời gian được gọi là 101 trong một program chạy trong 20 giây
Đã bình luận 06/6/2016 bởi Qbagaub (610 điểm)
Là có bất kỳ phân trang xảy ra?
0 Phiếu
Đã trả lời 04/6/2016 bởi abg_4812_Mo (610 điểm) 1 Phản ánh
Nó có thể là như thế nào nó (the-hệ thống-như-một-toàn bộ) thực hiện. Đọc là nhanh hơn dường như là một xu hướng phổ biến với một loạt các của hiệu suất tương đối thông qua. Trên một nhanh chóng phân tích DDR3 Intel và DDR2 trong bảng xếp hạng liệt kê, như một vài trường hợp chọn (write/read)% ; Một số hoạt động đầu trang DDR3 chip đang viết khoảng ~ 60-70% thông qua đọc. Tuy nhiên, có một số module bộ nhớ (tức là. Đế chế vàng CL11 -13-13 D3-2666) xuống chỉ ~ 30% viết. Hàng đầu thực hiện DDR2 chip dường như đã chỉ có khoảng ~ 50% thông qua viết so với đọc. Nhưng cũng có một số đối thủ đáng chú ý là xấu (tức là. OCZ OCZ21066NEW _ BT1G) xuống ~ 20%. Trong khi điều này không thể giải thích nguyên cho ~ 40% ghi/đọc báo cáo, như là điểm chuẩn code và cài đặt sử dụng có thể khác nhau (các ghi chú là mơ hồ ), điều này chắc chắn là một yếu tố . (Tôi muốn chạy một số chương trình chuẩn hiện tại và xem nếu số mùa thu trong-line với những người trong code đăng trong câu hỏi.) Cập Nhật
: tôi tải về table nhìn lên bộ nhớ từ các trang web được liên kết và xử lý trong Excel. Trong khi nó vẫn cho thấy một loạt các của các giá trị đó là ít hơn nhiều sever so với ban đầu trả lời ở trên mà chỉ nhìn vào bộ nhớ đọc trên chip và một vài mục đã chọn "thú vị" từ các bảng xếp hạng. Tôi không chắc chắn sự khác biệt, đặc biệt là trong khủng khiếp contenders chỉ ra ở trên, từ đâu đến. Tuy nhiên, ngay cả dưới vẫn còn khoảng từ 50%-100% (trung bình 65, nghĩa là 65) hiệu suất đọc. Lưu ý rằng chỉ vì một con chip này "100%" hiệu quả theo tỉ lệ ghi/đọc không có nghĩa là nó đã tốt hơn tổng thể... chỉ cần rằng nó đã hơn thậm chí-keel giữa hai hoạt động.
0 Phiếu
Đã trả lời 04/6/2016 bởi things_H (780 điểm)
Bộ đệm ẩn và địa phương gần như chắc chắn giải thích hầu hết các hiệu ứng mà bạn đang nhìn thấy. Không có bất kỳ bộ nhớ đệm hoặc địa phương trên viết, trừ khi bạn muốn có một hệ thống phòng không xác định. Hầu hết viết lần được đo bằng thời gian để data để có được tất cả các cách để phương tiện lưu trữ (cho dù đây là một ổ đĩa cứng hoặc một con chip bộ nhớ), trong khi đọc có thể đến từ bất kỳ số nào của bộ nhớ cache lớp có nhanh hơn so với phương tiện lưu trữ.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...