Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: SIMD Programing

  1. #1
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định SIMD Programing

    Gần đây mình mới biết được 1 kỹ thuật lập trình khá độc đáo với sự hỗ trợ trực tiếp của CPU mà dường như có rất ít người biết, đặc biệt nó lại thuộc ANSI/ISO C++ (có khả năng chạy trên mọi hệ điều hành).

    I. LỊCH SỬ PHÁT TRIỂN

    - SIMD ( Single Instruction, Multiple Data , xử lý đồng thời nhiều dữ liệu ) có nhiều công nghệ là XMM, SSE, SSE...

    - XMM được Intel ra mắt đầu tiên năm 1997 trên con CPU có tên là Intel Pentium MMX (đời cuối P2) nhằm tăng tốc độ xử lý về đồ họa lẫn Encode Media.


    - Sau đó AMD cũng đưa ra 1 công nghệ tương tự để cạnh tranh có tên là 3DNow lần đầu tiên trên con CPU K6 ( hồi trước mình xài con này nè 500MHZ)


    - Nếu đem so sánh giữa XMM thì 3DNow vượt trội hơn vì nó ra sau và hỗ trợ nhiều phép toán hơn (hỗ trợ kiểu float) và có 21 instructions.

    - 2 Năm sau. Một thế hệ mở rộng của XMM là SSE (Streaming SIMD Extensions) được ra đời (1999) trên con Pentium 3 đầu tiên của Intel để qua mặt 3DNow (AMD)! SSE cung cấp 70 instructions để làm việc công việc tính toán... và khắc phục nhược điểm ko tính toán trên kiểu số thực của XMM.

    - AMD cũng sản xuất CPU AlthlonXP (dòng K7) hỗ trợ đầy đủ tính năng SSE của Intel đưa ra và công nghệ này của AMD được đổi tên là "Enhanced 3DNow!" hay "3DNow!+".

    - 2001, SSE2 (Streaming SIMD Extensions 2) ra đời cùng với sự ra đời của P4 để mở rộng thêm SSE.

    - Vậy còn AMD. Đây là 1 giai đoạn chuyển đổi công nghệ của AMD nhằm tạo ra sự cạnh tranh theo hướng khác với Intel. AMD đã sử dụng công nghệ độc quyền trên CPU "Double Data Rate (DDR)" (giống như Ramx2 DDR2, hay PCI Express), công nghệ này truyền dữ liệu tuần tự (1 thời điểm chỉ có 1 bit trên 1 làn) và nhân xung lên bằng cách lên các "làn đường" trên đường truyền. AMD đã tăng xung nhịp FSB (Front Side Bus là BUS toàn MAINBOARD) từ 300MHZ -> 800 -> 1000 và hiện nay con đỉnh nhất của AMD có FSB tới 3600MHZ. Trong khi Intel vẫn dậm chân ở BUS 1333. Và công nghệ này có tên là "AMD HyperTransport".

    Và mãi tới năm 2003 AMD mới đem ra thị trường 2 dòng CPU 64 bit là Athlon64 (đối thủ P4) hỗ trợ SSE2.

    2004 SSE3 xuất hiện trên CPU P4 mang mã Prescott. Con Celeron D có lẽ khác với Celeron bình thường ở chỗ này. AMD thì tới 2005 mới đưa SSE3 vào 3DNow của mình.

    Và gần đây thì rất nhiều công nghệ SSE4 của Intel. AMD thì có SSE4a.

    Tháng 8 năm ngoái (2007) thì SSE5 được ra đời nhưng lại được AMD giới thiệu trước.
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 17-03-2008 lúc 03:20 PM.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    II. MMX Programing

    1. Giới thiệu
    Header :
    C++ Code:
    1. #include <xmmintrin.h>
    2. // xmm instruction

    Kiểu dữ liệu của MMX là: __m64 (lưu ý 2 dấu gạch).

    Như vậy chúng ta có thể hiểu nó như:
    - 1 Mảng 7 Bytes phần tử


    hay là:
    - 1 Mảng 4 phần tử kiểu Short hay Unsigned Short


    cũng có thể là:
    - 1 Mảng 2 phần tử kiểu Integer (unsigned Integer)


    và một con số 64bit __int64



    2. Đưa dữ liệu vào __m64


    Cách 1: Đưa bằng mảng:


    Ví dụ như:
    C++ Code:
    1. __m64 a;
    2. a.m64_i32[0] = 100;
    3. a.m64_i32[1] = 200;

    Cách 2: Đưa bằng hàm:

    Ví dụ đưa 8 phần tử 1bytes:
    C++ Code:
    1. __m64 a;
    2. a = _mm_set_pi8(1,2,3,4,5,6,7,8);

    Ví dụ đưa 4 phần tử (2 bytes):
    C++ Code:
    1. __m64 a;
    2. a = _mm_set_pi16(1,2,3,4);

    Ví dụ đưa 2 phần tử (4 bytes):
    C++ Code:
    1. __m64 a;
    2. a = _mm_set_pi32(100,200);

    3. Xử lý

    - MMX có môt số hàm xử lý cơ bản như cộng, trừ, nhân (chưa có chia)
    Ví dụ:

    C++ Code:
    1. #include <iostream>
    2.  
    3. #include <xmmintrin.h>
    4.  
    5. using namespace std;
    6.  
    7. int _tmain(int argc, _TCHAR* argv[])
    8. {  
    9.     __m64 a, b, c; 
    10.     a = _mm_set_pi32( 100, 200 );
    11.     b = _mm_set_pi32( 200, 500 );
    12.  
    13.     c = _mm_add_pi32( a, b );
    14.     // Thực hiện phép cộng và đưa vào c.
    15.    
    16.     cout << c.m64_i32[0] << endl;
    17.     cout << c.m64_i32[1] << endl;  
    18.  
    19.     _mm_empty();
    20.     // Xóa giá trị trên các thanh ghi xmm
    21.    
    22.     return 0;
    23. }

    Kết quả sẽ cộng (200 và 500) (100 và 200)
    Code:
    700
    300
    Press any key to continue . . .
    Rắc rối hơn nhưng tốc độ xử lý sẽ nhanh hơn rất nhiều. Bởi vì nó ko thực hiện phép cộng bằng những Instruction ASM như {mov eax, add... } và làm trên những thanh ghi xmm đặc biệt.
    Ví dụ mình thực hiện phép nhân các phần mảng a cho mảng b kq lưu ở mảng c trên kiểu short 16bit.

    C++ Code:
    1. #include "stdafx.h"
    2. #include <iostream>
    3.  
    4. #include <xmmintrin.h>
    5.  
    6. using namespace std;
    7.  
    8. void Mul (short a[], short b[], short c[], short n){
    9.     int i;
    10.     for (i = 0; i < n; i++)
    11.         c[i] = a[i] * b[i];
    12. }
    13.  
    14. int _tmain(int argc, _TCHAR* argv[])
    15. {  
    16.     short a[3000];
    17.     short b[3000];
    18.     short c[3000];
    19.    
    20.     int i;
    21.  
    22.     for (i = 0;i<3000;i++){
    23.         a[i]  = 2;
    24.         b[i]  = 3;
    25.     }
    26.  
    27.    
    28.     Mul(a, b, c, 3000 );
    29.    
    30.     cout << c[500] << endl;
    31.  
    32.     return 0;
    33. }

    Mình in đại phần tử c[500] để kiểm tra kq mà thôi: 6.

    Bây giờ mình thay thế hàm
    void Mul () bằng hàm sau đây.
    C++ Code:
    1. void Mul_XMM (short a[], short b[], short c[], int n){
    2.     __m64 *pA, *pB, *pC;   
    3.    
    4.     pA = (__m64*) a; // pA trỏ đầu mảng a
    5.     pB = (__m64*) b; // pB trỏ đầu mảng b
    6.     pC = (__m64*) c; // pC trỏ đầu mảng c
    7.  
    8.     int i;
    9.     for (i = 0; i < n; i+=4){
    10.         *pC = _mm_mullo_pi16 (*pA, *pB);
    11.         // c = a x b
    12.         // Thực hiện 1 lần 4 phần tử (64bit)
    13.  
    14.         pA++;
    15.         pB++;
    16.         pC++;
    17.     }
    18.     _mm_empty();
    19. }

    Kết quả y chang:
    TEST 1 lần nữa nhé (có kiểm tra thời gian thực thi chính xác với từng tick của CPU).

    C++ Code:
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {  
    3.     short a[3000];
    4.     short b[3000];
    5.     short c[3000];
    6.    
    7.     int i;
    8.  
    9.     for (i = 0;i<3000;i++){
    10.         a[i]  = 2;
    11.         b[i]  = 3;
    12.     }
    13.  
    14.     __int64 nFreqency, nTimeBegin, nTimeEnd;
    15.     double fRate, fDeltaTime;
    16.  
    17.     QueryPerformanceFrequency( (LARGE_INTEGER*) &nFreqency );
    18.     fRate = 1.0/ (double) nFreqency;
    19.    
    20.     QueryPerformanceCounter( (LARGE_INTEGER*) & nTimeBegin );
    21. //  Mul_XMM (a, b, c, 3000);
    22.     Mul(a, b, c, 3000 );
    23.     QueryPerformanceCounter( (LARGE_INTEGER*) & nTimeEnd );
    24.  
    25.     // Thời gian thực hiện   
    26.     fDeltaTime = ((nTimeEnd - nTimeBegin) * fRate) ;
    27.  
    28.     cout << "Kiem tra c[500]: " << c[500] << endl;
    29.     cout << "Thoi giant huc hien: " << fDeltaTime << "milisecond" << endl;
    30.     return 0;
    31. }

    Kết quả rất khả quan:
    * dùng phương pháp bình thường.
    Code:
    Kiem tra c[500]: 6
    Thoi giant huc hien: 3.04508e-005milisecond
    Press any key to continue . . .
    * Dùng MMX
    Code:
    Kiem tra c[500]: 6
    Thoi giant huc hien: 1.20127e-005milisecond
    Press any key to continue . . .
    TEST trên CELERON 1.7GHZ cho thấy với hỗ trợ MMX tốc độ xử lý nhanh hơn bình thường gần 3 lần. Do đó nếu xử lý ảnh tốc độ 20 hình/s thì với MMX có thể đạt len 60 hình/s.

    4. Một số hàm khác với MMX


    "Tham khảo từ MSDN: http://msdn2.microsoft.com/fr-fr/library/698bxz2w.aspx"


    III. SSE Programing
    // Cập nhật sau....

  3. #3
    Ngày gia nhập
    10 2007
    Bài viết
    4

    Lâu rồi sao ko thấy bác cập nhật tiếp bài tut về "SIMD Programing" nhỉ? Em thấy cái này rất hay.
    ...imagination is more important than knowledge....

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    không rõ tại sao nhưng mình test thấy MMX chạy chậm hơn,mà mấy hàm của nó giống kiểu ASM thế

Các đề tài tương tự

  1. Ebook Programing iPhone
    Gửi bởi AlexF trong diễn đàn Nhập môn lập trình Objective-C
    Trả lời: 4
    Bài viết cuối: 16-09-2013, 12:55 PM
  2. [Cần bán] sách tiếng anh về lập trình C programing language & C++ programing language
    Gửi bởi Kingmax trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 3
    Bài viết cuối: 23-11-2011, 11:45 AM
  3. Hiểu Cách Viết 1 Hàm Shell Programing ?
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình shell Linux
    Trả lời: 1
    Bài viết cuối: 31-03-2011, 11:00 AM
  4. cannot connect to X server QT Programing
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 1
    Bài viết cuối: 09-11-2010, 02:19 PM
  5. [Chia sẻ] The C++ Programing Language!
    Gửi bởi trantuananh24hg trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 0
    Bài viết cuối: 08-09-2006, 06:42 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn