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 Initia (100,510 đ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: 1.6 GHz * 8 bytes = 12.8 GB/s 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;
}

Xin vui lòng đăng nhập hoặc đăng ký để trả lời câu hỏi này.


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!







...