Tính số Fibonacci dual-core
esp32
1
IoT
11
White

Tuan PM viết ngày 14/10/2016

Theo mạch cảm hứng từ bài viết Bàn về phương pháp tối ưu tính tổng các số Fibonacci của Bác Huy Trần và mình có trong tay chip ESP32 dual core chạy FreeRTOS. Nên cũng muốn kiểm tra hiệu năng dual-core như thế nào.

FreeRTOS là RTOS cho các chip với rất hạn chế về tài nguyên bộ nhớ, chỉ tầm vài chục KB RAM là chạy phà phà. Chính vì thế việc thực nghiệm đa luồng, đa nhân trên FreeRTOS khá dễ hiểu và ít sự phức tạp như khi làm trên các hệ điều hành như Linux.

Mục đích của thử nghiệm này đơn giản mình chỉ muốn thấy rõ sự khác biệt khi thực thi 1 core và 2 core, không có ý định giải quyết các vấn đề toán học cũng như phân tải, chia luồng.

Về cơ bản, bài viết trên đã nói rõ chi tiết rồi, dưới đây mình chỉ làm sao để chạy được trên 2 nhân và đồng bộ hóa thế nào thôi. Vì Fn = F(n-1) + F(n-2), nên cách đơn giản nhất là cứ chia ra, F(n-1) cho thằng core 1 xử lý, còn thằng F(n-2) cho thằng core 2 xử lý. Thằng core1 dĩ nhiên phải làm nhiều hơn thằng core2 một chút.

Hàm tính Fibonacci như sau:

 int fib(int n)
{
    if (n < 2) return n;
    else {
        int x = fib(n - 1);
        int y = fib(n - 2);
        return x + y;
    }
}

Để test với 2 nhân thì cần đồng bộ hóa 2 task chạy trên 2 nhân, với FreeRTOS thì task notify sẽ có hiệu suất cao hơn, nhưng giai đoạn này bản esp-idf chưa hoàn thiện và task notify chưa hoạt động, do đó mình dùng Binary Semaphore. Task dành cho Core1 sau khi thực thi xong sẽ Give Semaphore, và tự hủy. Task dành cho Core0 sau khi tính toán xong thì đợi Semaphore rồi lấy tổng. Mục đích của mình là test performance nên không quan tâm tới kết quả test

 void core1_task(void *ptr)
{
    int i = ((thread_args *) ptr)->input;
    ((thread_args *) ptr)->output = fib(i);
    xSemaphoreGive(xSemaphore);
    vTaskDelete(NULL);
}

 int test_dual_core(int num)
{
    thread_args args;
    int start, end, f;

    start = xTaskGetTickCount();

    args.input = num - 1;
    xTaskCreatePinnedToCore(core1_task, "core1", 10*1024, &args, 10, NULL, 1);
    f = fib(num - 2);
    xSemaphoreTake(xSemaphore, portMAX_DELAY);
    f += args.output;
    end = xTaskGetTickCount();
    return end - start;
}

Kết quả test của mình khá ấn tượng, hơn 1.65. Nếu làm trên máy tính tầm 1.5 thôi - có lẽ nhiều overhead cho các tác vụ hệ điều hành.

alt text

Link toàn bộ dự án, biên dịch cho ESP32:
https://github.com/tuanpmt/esp-fibonacci-dualcore-test/blob/master/main/main.c

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Tuan PM

8 bài viết.
87 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
18 9
Giới thiệu Bài viết này nhằm mục đích giới thiệu về IoTs, các phần cứng, platform hỗ trợ Những ưu điểm của vượt trội của các platform dùng LUA,...
Tuan PM viết 3 năm trước
18 9
White
13 4
Máy tính nhúng giá rẻ Raspberry Pi không còn xa lạ với các bạn thích công nghệ. Ngoài những ứng dụng dành cho giải trí đa phương tiện, Raspberry Pi...
Tuan PM viết 3 năm trước
13 4
White
13 1
Tổng quan Hiện tại Raspberry PI đã ra phiên bản 3, với nhiều tính năng vượt trội, đặc biệt là đã tích hợp Wifi + BLE trong khi giá vẫn không đổi. ...
Tuan PM viết hơn 2 năm trước
13 1
Bài viết liên quan
White
8 0
Các tiêu chí để lựa chọn hệ điều hành cho các thiết bị IoT như sau: Tiết kiệm năng lượng, tiết kiệm tài nguyên, có thể sử dụng trên những MCU siz...
Tuan PM viết gần 2 năm trước
8 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
8 bài viết.
87 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!