Thông báo

Collapse
No announcement yet.

Innovative microprocessor architecture

Collapse
This topic is closed.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #31
    Nguyên văn bởi lntran Xem bài viết
    Bác Hithere123 đang làm về controller mình giới thiệu bác đọc quyển "Computer Organization and Design Hardware Software Interface". Quyển này là bible trong ngành computer architecture đó. Nhưng quyển này viết ở mức thấp (ý mình nói mức thiết kế như RTL chẳng hạn) nên dễ hiểu. Đọc xong quyển này bác thừa sức thiết kế một processor đơn giản. Còn một quyển bible nữa là "Computer Architecture a Quantitative Approach". Quyển này viết ở mức kiến trúc hơi trìu tượng. Quyển này cần có kiến thức và kinh nghiệm một chút mới nên đọc, nhưng làm việc ở mức cao thì không thể không biết.
    Chào bác lntran,

    Cảm ơn bác đã giới thiệu sách tham khảo hay. Background của em là analog, lại làm chuyên về power, nên toàn phải dùng kỹ thuật rất cũ bác ạ. Em khoái chỉnh kích thước mosfet rồi soi layout, sau đó nghịch silicon để debug. Gần đây phải đụng digital là bất đắc dĩ thôi, nhưng thấy mỗi cái đều có cái hay riêng. Ví dụ em làm một bộ lọc notch nhỏ nhỏ mà tần số cắt chuẩn lắm bác ạ, sướng hơn anh tương tự nhiều, hay như cái cấu trúc điều khiển PI, thích gain bao nhiêu là đúng bấy nhiêu. Còn về uC thì em không phải là chuyên, mới chỉ dừng lại ở mức simulation thôi chứ chưa có silicon out bác ạ. Thiết kế một test chip, mục đích là để xem liệu nhét cả một uC vào một con power thì nó sẽ thế nào (ý tưởng là cho phép người dùng tự thiết kế con power mình muốn, một dạng kiểu tương tự FPGA).

    Nếu bác giới thiệu xong phần concept, mà bác còn hứng thì làm luôn cả flow để mọi người biết thêm về desing số bác ạ.

    Rất mong.

    P/S: mà các bác đã định luộc Mr.Paul chưa đấy ạ, nếu các bác định nhậu thì ới em phát nhá.

    Comment


    • #32
      Hi các bác,

      Mình viết tiếp về kiến trúc của PE nhé.

      Hình dưới đây là kiến trúc PE đã được đơn giản.



      Kiến trúc PE của mình hết sức đơn giản. Mỗi PE có 8 Input port, 8 output port. Dữ liệu đầu vào có thể qua Mux đẩy thẳng ra đầu ra, hoặc có thể đưa qua ALU xử lý rồi đưa ra đầu ra. Decoder lấy dữ liệu từ Instruction buffer, decode, và điều khiển ALU cũng như Mux.

      Ở đây mình sử dụng dataflow nên Mux chỉ truyền dữ liệu khi dữ liệu đầu vào xuất hiện. Việc xác định sự xuất hiện của dữ liệu thông qua 1 bit token. Tương tự như vậy ALU cũng chỉ xử lý dữ liệu khi có đầu đủ dữ liệu đầu vào.

      Để tăng hiệu quả xử lý, mình sử dụng 8 ALU 64 bit trong mỗi PE. Các ALU này có thể lấy dữ liệu từ 8 đầu vào, hoặc các đầu ra của ALU khác trong PE, hoặc các thanh ghi đặc biệt. Các đầu ra của PE cũng có thể lấy dữ liệu từ các đầu vào PE, hoặc 8 đầu ra của ALU hoặc không truyền dữ liệu ra. Bên cạnh đó, mỗi PE cũng có 8 đầu vào 1 bit, và 8 đầu ra 1 bit. Dữ liệu 1 bit này dùng để tính toàn các lệnh điều kiện sử dụng cho "Merge", và "Branch".

      Trong mỗi PE có thêm 2 thanh ghi đặc biệt để các ALU sử dụng. 1 thanh ghi thực ra là giá trị 0, và 1 thanh ghi 64 bit có thể nạp giá trị từ IFU. Thanh ghi này được sử dụng cho các lệnh tính toán với hằng số.

      Trước đây mình chỉ định sử 1 ALU cho một PE, nhưng sau đó mình nhận ra việc này kém hiệu quả. Trong reconfigurable processor, connection link rất quan trọng và chiếm nhiều diện tích. Việc cho phép 8 ALU có thể kết nối lẫn nhau làm tăng việc sử dụng các kết nối lên rất nhiều. Ở đây, trong một PE mình có nhiều ALU, và các ALU này có thể chạy song song với nhau. Đây thực ra cũng là cách áp dụng kiến trúc VLIW (Very Long Instruction Word).

      Mấy hôm nay bận quá nên mình không viết nhiều được. Mình dự định sau khi trình bày xong về kiến trúc vi xử lý của mình, sẽ giới thiệu với mọi người một số kiến trúc vi xử lý mới hiện nay như CUDA... Mình không làm về CUDA cũng như các kiến trúc này như mình cũng biết một chút. Mỗi loại có cái hay riêng, cũng như có những ứng dụng riêng. Bác nào chuyên làm về các loại vi xử lý kiểu mới này xin vào góp vui.

      Cheers,

      Comment


      • #33
        Xin lỗi các bác, hình của PE đã được đơn giản không thấy lên trong lần post trước. Mình upload lại ở đây.

        Comment


        • #34
          Hi các bác,

          Để mình viết tiếp nhé. Như các bác thấy, kiến trúc PE này rất đơn giản. Lệnh từ buffer, qua decoder, điều khiển Mux, và ALU. Dữ liệu chạy trực tiếp từ input port qua output port thông qua Mux hoặc qua ALU, Mux rồi ra ngoài. Nếu so sánh với các processor đơn giản thì nó còn đơn giản hơn, vì các processor đơn giản còn có Register file, cũng như việc xử lý các lệnh điều kiện để thay đổi việc nạp instruction.

          Trong số 8 ALU 64 bit mình định chỉ dùng loại integer number vì các ứng dụng server gần như không sử dụng floating point number. Ngoài ra lệnh nhân và chia xác suất sử dụng cũng nhỏ hơn 1% nên có thể không được sử dụng. Thay vào đó có thể sử dụng các lệnh công trừ và shift.

          Như mình có nói kiến trúc dataflow không sử dụng các lệnh nhảy như kiểu Von Neumann mà sử dụng 2 lệnh đặc biệt là "Branch", "Merge". Vì vậy PE của mình cũng có một ALU đặc biệt xử lý các lệnh này. Khi lệnh nạp lên sử dụng ALU này thì 3 ALU thông thường sẽ bị loại bỏ. ALU đặc biệt này có thể cấu hình theo một trong 3 cách tùy theo lệnh nạp (op-code) như hình sau:

          Theo cầu hình thứ nhất, tùy theo điều kiện vào (1 bit) dữ liệu sẽ được chuyển từ 1 trong 2 đầu vào(64 bit) ra đầu ra. Đây là lệnh "Merge". Cầu hình thứ hai để thực hiện lệnh "Branch", tùy theo điều kiện vào dữ liệu sẽ được đưa từ 1 đầu vào ra 1 trong số 2 đầu ra. Cầu hình cuối cùng là phần mở rộng của hai loại trên. Loại này được sử dụng cho các vòng lặp như while loop, for loop. Dữ liệu đầu tiên được đưa qua Merge, rồi đưa ra ngoài kiểm tra điều kiện để đẩy ra Branch, cũng như lấy dữ liệu từ vòng lặp sau.

          Cheers.

          Comment


          • #35
            Hic,

            Sao mình upload ảnh bị lỗi vậy. Để mình upload lại nhé. (ảnh Branch-Merge ALU)

            Comment


            • #36
              Hi các bác,

              Bây giờ mình nói về asynchronous pipeline. Asynchronous pipeline là một kỹ thuật thiết kế mạch. Mình áp dụng kỹ thuật này để thực hiện kiến trúc dataflow, tức là khi dữ liệu đến mới chạy, khi chưa có dữ liệu thì ALU vẫn nằm chờ (khác với kiểu thông thường ALU chạy theo từng xung đồng hồ). Asynchronous pipeline có nhiều ưu điểm hơn so với Synchronous pipeline những cũng có nhiều nhược điểm. Hiện nay kỹ thuật asynchronous pipeline ít phổ biến nên nhiều người vẫn không nghe nói đến. Ảnh dưới đây mình so sánh 2 kiểu pipeline.

              Comment


              • #37
                Kiểu thứ nhất là synchronous pipeline thì mọi người đã quá quen thuộc rồi. Clock signal dùng để đồng bộ tất cả các Flipflop. Giữa các flipflop là combinational logic circuit. Bên dưới là kiểu asynchronous pipeline (có nhiều cách thực hiện asynchronous pipeline. Ở đây mình chỉ trình bày 1 cách). Flipflop được thay thế bằng latch. Clock được thay thế bằng handshaking signal. Khi có dữ liệu ở tầng phía trước và dữ liệu ở tầng phía sau đã được tính toán thì mạch điều khiển sẽ enable latch, báo cho tầng trước biết đã lấy dữ liệu mới, và tầng sau biết đã có dữ liệu mới. Ngoài ra cần một mạch delay để đảm bảo dữ liệu qua combinational logic circuit đến trước tín hiệu điều khiển. Việc thực hiện mạch delay này có rất nhiều cách. Bác nào thiết kế DLL (Delay Lock Loop) thì hẳn biết rất rõ. Ở đây để tăng tính ổn định, mình bắt chước kiểu Digital DLL với việc thay đổi số tầng NAND stage.

                Kiểu Asynchronous pipeline này khi kết hợp với Domino logic thì cực kỳ hiệu quả. Với thiết kế Domino logic, Handshaking signal chính là clock signal. Khi có dữ liệu, clock =1 mạch ở trạng thái evaluation, và dữ liệu sẽ được đẩy ra tầng sau. Khi đang chờ dữ liệu, clock =0, mạch ở trạng thái precharge. Thêm vào đó ta có thể loai bỏ toàn bộ Latch. Sau khi một mạch chuyển sang trang thái Evaluation, nếu đầu vào của nó chuyển về giá trị 0 (tầng trước chuyển về pre-charge) cũng không ảnh hưởng đến kết quả. Việc loại bỏ latch trong mạch là điều rất quan trọng. Các bác biết là mình thiết kế PE 64 bit. Trong PE có 8 output mux, 8 ALU, tức là có khoảng 16*64 latch. Nếu array có 1024 PE thì số lượng latch rất lớn. Latch có diện tích lớn nên sẽ làm mạch trở nên rất lớn. Nhưng việc loại bỏ toàn bộ latch cũng làm cho việc test chip trở nên rất khó khăn.

                Cheer.

                Comment


                • #38
                  Hi các bác,

                  Hôm nay mình sẽ giới thiệu tiếp với mọi người về kỹ thuật nạp lệnh cho PE (Instruction fetching). Các loại reconfigurable processor thông thường hay sử dụng phương pháp context switching để nạp lệnh. Theo cách này, việc cấu hình cho processor gồm một array PE được chia ra thành nhiều lớp (layer). Sau khi lệnh của lớp thứ nhất được nạp lên PE và chạy, lệnh của lớp thứ hai được đưa vào buffer. Sau khi lớp thứ nhất xử lý xong dữ liệu, một tín hiệu đồng bộ được sinh ra. Tín hiệu này sẽ được truyền ra toàn array, và các PE sẽ nạp lệnh thứ hai lên thay thế. Việc thay thế lệnh được diễn ra đối với tất cả PE trên toàn bộ array. Vì vậy họ thường gọi cách này là context switching. Kỹ thuật này cũng được thay đổi và sử dụng với cả general purpose processor ví dụ như TRIPS processor. CUDA processor không sử dụng phương pháp nạp lệnh này những cũng sử dụng kỹ thuật động bộ tương tự.

                  Phương pháp context switching này mặc dù được reconfigurable processor sử dụng rộng rãi nhưng mình nghĩ nó phù hợp với để xử lý DSP hơn là general purpose application, và thực tế các reconfigurable processor chủ yếu vẫn được dùng để xử lý các tín hiệu video. Phương pháp này theo mình nghĩ có 3 điểm không phù hợp với general purpose application.

                  Thứ nhất có thể dễ dàng nhận thấy phương pháp này rất cứng nhắc vì yêu cầu phải thay đổi lệnh với tất cả các PE trong array. Trong nhiều trường hợp, chúng ta chỉ muốn thay đổi lệnh trên một số ít PE. Khi đó cách làm này không linh hoạt, kém hiệu quả.

                  Thứ hai việc tạo ra tín hiệu thay đổi context không dễ dàng. Nếu dùng để xử lý các tín hiệu số, dữ liệu và giải thuật đã cố định từ trước. Các điều kiện để đồng bộ cũng như chuyển đổi lệnh có thể tính toán từ trước, trong khi đó các general purpose application có thể chạy theo nhiều hướng khác nhau. Với CUDA, người lập trình phải xác định rõ điều kiện đồng bộ trong khi lập trình. Với TRIPS, điều kiện đồng bộ rất đơn giản nhưng vì vậy lệnh phải liên tiếp nạp vào PE nên đây không thể coi là kiểu làm việc của reconfigurable processor, và điều này cũng ảnh hưởng đến hiệu suất hoạt động. Kể cả khi tín hiệu chuyển đổi context này được sinh ra, việc truyền tín hiệu này đến toàn array và thay đổi lệnh một cách đồng bộ cũng không đơn giản.

                  Thứ ba, các general purpose application nhiều khi không sử dụng hết toàn bộ PE trong array. Nếu chỉ dùng vài chục PE trong một array lên đến hàng nghìn PE thì quá lãng phí. Cách tốt nhất là ghép nhiều phần có thể chạy song song với nhau lên chung một array. Nhưng vì việc thay đổi lệnh được diễn ra với tất cả các PE trong array, nên tất cả các phần chạy này phải được đồng bộ. Đây là điều hết sức vô lý vì nhiều khi phần thứ nhất đã chạy xong cần nạp lệnh mới trong khi đó phần thứ hai vẫn chưa xong. Khi đó tất cả các phần đều phải chờ.

                  Chính vì vậy mình sử dụng phương pháp nạp lệnh hoàn toàn khác. Thứ nhất mình sử dụng 2 loại lệnh repeated instruction và sequential instruction. Lệnh sequential instruction sau khi nạp chỉ chạy 1 lần, và PE sẽ nạp lệnh tiếp theo ngay. Loại lệnh này được dùng để chạy các lệnh ngoài vòng lặp. Loại repeated instruction sử dụng với các lệnh trong vòng lặp. Khi PE nạp các lệnh này, nó sẽ chạy nhiều lần. Sau khi vòng lặp kết thúc, ta phải loại bỏ các lệnh này để nạp lệnh mới cho vòng lặp sau. Việc này thực hiện theo cách sau.

                  Vòng lặp được cấu trúc lên nhờ các lệnh "Branch', "Merger". Khi vòng lặp kết thúc và cần nạp lệnh mới. Lệnh "Branch" một mặt đẩy dữ liệu ra ngoài vòng lặp, một mặt sinh ra tín hiệu "Done". Tín hiệu này cũng tương tự như dữ liệu được đẩy liên tiếp qua các PE. Khi PE nhận được tín hiệu "Done" ở các đầu vào, nó sẽ sinh ra tín hiệu "Done" ở các đầu ra, loại bỏ repeated instruction hiện thời, và nạp lệnh tiếp theo. Theo cách này tín hiệu "Done" sẽ chạy một vòng qua các vòng lặp, và quay trở về "Branch" ban đầu. Khi đó "Branch' sẽ loại bỏ tín hiệu "Done" và nạp lệnh mới kết thúc việc xử lý dữ liệu của vòng lặp. Khi có vòng lặp nằm trong vòng lặp, chỉ vòng lặp ngoài cùng mới có thể tạo ra tín hiệu "Done".

                  Cuối cùng, để tăng độ linh hoạt của Processor, mình cũng cho phép nó chạy các lệnh nhảy như kiểu von Neumann. Khi đó PE bên trong array, phát lệnh đọc dữ liệu lên LSU. LSU sẽ nạp lệnh mới lên IFU. Cách này cho phép processor chạy các DLL, functional pointer, class... hay các lệnh nhảy quá xa mà không thể sử dụng "Branch", "Merge" để đưa vào array. Tuy nhiên việc PE nạp lệnh mới cho IFU có latency lớn nên ít được sử dụng thường xuyên.

                  Cheers.

                  Comment


                  • #39
                    Hi các bác,

                    Hôm nay mình viết tóm tắt lại toàn bộ hoạt động của vi xử lý.

                    Vi xử lý gồm một mảng 2 chiều các PE kết nối với nhau. Lệnh được đưa vào PE thông qua một mạng sử dụng kiểu chuyển mạch gói. Mỗi lệnh có một địa chỉ tương ứng với vị trí của PE ở trong array. Lệnh sẽ được đưa vào trong Instruction buffer của PE. Sau khi lệnh được nạp lên PE, nó sẽ điều khiển các Mux cũng như ALU của PE để hình thành nên một dataflow graph network. Mỗi ALU tương ứng với một node trong graph, và mỗi connection link được điều khiển bởi Mux tương ứng với một edge trong graph. Dữ liệu sẽ được truyền và xử lý theo flow ở trong graph này từ tầng trước đến tầng sau. Nhờ kỹ thuật asynchronous pipeline, các ALU và Mux chỉ xử lý dữ liệu khi đầu vào xuất hiện dữ liệu. Ngoài ra PE sử dụng 2 loại lệnh là sequential instruction và repeated instruction. Sequential instruction là loại lệnh nạp lên 1 lần chạy 1 lần. Loại này dùng để chạy các lệnh nằm ngoài vòng lặp. Repeated instruction là loại lệnh nạp 1 lần chạy nhiều lần. Loại này dùng để chạy các lệnh trong vòng lặp. Sau khi nạp lệnh repeated instruction lên, array sẽ hình thành một dataflow network và xử lý nhiều dữ liệu của vòng lặp theo kiểu pipeline hay dataflow. Sau khi vòng lặp kết thúc, một tín hiệu "Done" sẽ được sinh ra và truyền đi toàn bộ các PE xây dựng nên vòng lặp. Các PE này sẽ bỏ lệnh cũ và nạp lệnh mới để chạy dữ liệu tiếp theo. Trong thời gian chạy dữ liệu của vòng lặp trước, ta có thể nạp lệnh của vòng lặp sau. Hiệu suất của vi xử lý có thể đạt được ở mức rất cao khi nhiều PE có dữ liệu đầu vào cùng lúc. Khi đó các PE này có thể chạy đồng thời tương tự như việc sử dụng các slide trong FPGA. Cuối cùng vi xử lý cho phép ghi/đọc nhiều dữ liệu từ bộ nhớ cùng lúc. Thực ra việc ghi/đọc dữ liệu phải được thực hiện theo thứ tự lập trình một cách chặt chẽ. Tuy nhiên khi các vị trí ghi, đọc không liên quan đến nhau thì thứ tự thực hiện không quan trọng. Phần LSU của vi xử lý có khả năng phân tích sự phụ thuộc dữ liệu này để có thể thay đổi thứ tự (giống như các superscalar processor còn được gọi là Out-of-order processor).

                    Bây giờ mình nói qua việc làm compiler cho vi xử lý. Mình không có chuyên môn về compiler nên không thể viết chi tiết. Phần mềm được viết bằng C/C++ được compiler tạo ra một dataflow graph trong đó mỗi node của graph tương ứng với 1 lệnh, mỗi edge của graph biểu hiện sự phụ thuộc dữ liệu (dữ liệu ra của node trước là dữ liệu vào của node sau). Sau đó compiler thực hiện việc mapping, placing, routing graph này vào trong array. Công việc này cũng tương tự như các compiler xử lý verilog code và map vào trong FPGA. Cuối cùng binary code được sinh ra. Thật ra làm compiler là một công việc rất challenging và mình không hi vọng có compiler tốt trong giai đoạn đầu. Cách đơn giản hơn là làm driver. Driver là một library các lệnh căn bản mà chương trình sẽ sử dụng. Ở đây mình sẽ xây dựng một library các SQL command. Library được viết bằng machine code nên đạt mức tối ưu cao. Các chương trình sẽ goi đến các lệnh của library này.

                    Cuối cùng mình muốn phân tích một chút về tính chất của vi xử lý này. Loại này thứ nhất là chạy single threaded application hoàn toàn khác với các loại multi-core processor khác phải chạy nhiều thread. Điều này hết sức quan trọng vì hầu hết các ứng dùng đều là single threaded. Thứ hai loại này đạt hiệu suất cao vì nhiều PE có thể cùng chạy một lúc khi dữ liệu đầu vào của chúng cùng xuất hiện. Thứ ba, hiện tượng tắc nghẽn giữa bộ nhớ và vi xử lý được giảm xuống vì vi xử lý chỉ chạy một chương trình duy nhất. Thứ tư, công việc thiết kế khá đơn giản vì ta chỉ cần làm 1 PE rồi replicate ra toàn bộ array. Cuối cùng mạch tiêu thụ công suất thấp vì PE chỉ chạy khi có dữ liệu; loại bỏ việc sử dụng clock; controller của PE quá đơn giản và lệnh nạp 1 lần nhưng chạy nhiều lần; và các đường connection links rất ngắn (locality).

                    Tuy nhiên vi xử lý này cũng có một số vấn đề. Mặc dù thiết kế PE về mặt cấu trúc đơn giản nhưng lại gặp vấn đề về đồng bộ. Với vi xử lý thông thường đồng bộ được thực hiện bằng tín hiệu clock đơn giản. Với PE loại này sử dụng asynchronous pipeline đồng bộ bằng token rất phức tạp đó là chưa nói đến việc xử lý tín hiệu "Done". Ngoài ra asynchronous pipeline cũng tạo ra vấn đề với testability. Loại này hoàn toàn không thể sử dụng scan-chain test. Cuối cùng ta có thể thấy lệnh, và dữ liệu bên trong array sau khi đã đưa vào thì không thể lấy ra dễ dàng. Điều này nghĩa là vi xử lý không thể thực hiện được interruption và chạy debug mode. Điều này cũng chẳng có gì đáng ngạc nhiên vì vi xử lý CUDA cũng tương tự không thể chạy debug mode, và hỗ trợ interruption. Interruption được xử lý bởi master processor ví dụ như Xeon, và khi cần chạy debug, người ta sử dụng emulator là một software giả lập làm vi xử lý.

                    Như vậy là mình đã trình bày xong về kiến trúc vi xử lý do mình đề xướng. Bác nào làm về computer architecture cho mình ý kiến nhé. Và hôm nữa mình sẽ giới thiệu và kiến trúc multi-core tiêu biểu để so sánh. Sau đây mình chỉ giới thiệu sơ lược thôi.

                    Mình nghĩ các multi-core processor hiện nay có thể chia ra 3 loại để trình bày. Loại thứ nhất theo kiểu của CUDA processor. Kiểu này là loại Single Thread Multiple Data (STMD). Người lập trình sẽ viết giải thuật xử lý 1 đơn vị dữ liệu. Vi xử lý sẽ dùng giải thuật này để chạy với rất nhiều dữ liệu. Loại này được Nvidia quảng cáo dùng cho các ứng dụng khoa học cũng chẳng có gì sai. Thông thường các ứng dụng về vật lý, công nghệ, cơ khí, xây dựng... người ta hay sử dụng thuật toán phần tử hữu hạn (finite element). Tức là người ta chia một vật làm rất nhiều phần tử nhỏ và giải thuật xử lý các phần tử này giống nhau. Nếu ở đây có bác nào thiết kế về khí động học cho máy bay, hay tên lửa thì mình thành thật khuyên bác nên sử dụng CUDA processor. Tuy nhiên ứng dụng của nó cũng chỉ dừng lại tại đây.

                    Một loại khác thực sự là kiến trúc multi-core ví dụ như Tilera processor có chứa hàng trăm vi xử lý trên 1 chip. Loại này nhiều khi được gọi là many core để phần biệt với loại multi-core thông thường. Loại này như mình có lần đã từng post lên, đơn giản ngày xưa multi processor là nhiều processor trên cùng một board, ngày này nhiều core trên cùng một die. Nói như vậy cũng không phải loại này chẳng có một chút innovative gì hết. Về processor core thì thật sự chẳng có gì. Thông thường mấy loại này hay dùng MIPS 2-way superscalar. Điều quan trọng nhất chính là network-on-chip kết nối các processor core này. Network này không chỉ trao đổi dữ liệu thông thường mà còn có nhiệm vụ cache coherency, đảm bảo cùng 1 dữ liệu xuất hiện trên cache của nhiều core vẫn có thể hoạt động đúng. Yêu cầu về network này vừa phải low latency, high bandwidth... vừa phải nhỏ gọn đơn giản. Giới thiệu về network này e rằng một quyển sách cũng chưa đủ. Nhưng vấn đề của vi xử lý loại này là ai sẽ sử dụng hàng trăm core khi phần mềm chỉ chạy 1 thread. Mình biết rằng loại này được đề xuất dùng làm network processor tức là để truyền các data package theo một số các protocol định sẵn. Các package riêng biệt có thể được xử lý bằng các core riêng biệt. Tuy nhiên communication protocol thường là được chuẩn hóa và có thể làm cứng bằng ASIC hoặc có thể sử dụng FPGA khi chưa có ASIC. Một thực tế rõ ràng, khi cứng hóa các chuẩn này bằng ASIC thì hiệu suất chạy sẽ cao hơn loại dùng phần mềm chạy trên vi xử lý nhiều lần, và đương nhiên chẳng ai sử dụng các chip Intel hay AMD dùng cho network hết. Do vậy mình tin rằng những vi xử lý loại này chỉ có thể chiếm được một phần thị trường về network processor. Mình cũng nghe nói Tilera định dùng vi xử lý của họ làm webserver. Ý tưởng này rất OK những có bao nhiêu khách hàng cần đến một vi xử lý với hàng trăm core để chạy webserver khi web application là một yêu cầu đơn giản và các vi xử lý của Intel đã thừa khả năng đáp ứng. Cuối cùng họ cũng định dùng vi xử lý của mình cho các ứng dụng cloud computing. Tuy nhiên cho đến bây giờ mình chẳng thấy mấy ai quan tâm đến cloud computing. Cloud computing có thành hiện thực hay không vẫn chưa ai biết, và kể cả khi nó thành hiện thực thì các vi xử lý của Intel cũng sẽ chẳng dừng lại ở mức 4/8 core.

                    Loại thứ ba rất cơ bản là multi-core processor như các chip của Intel, AMD, PowerPC 7, Cell processor... Loại này thực ra cũng tương tự như loại thứ hai tức là gồm một số processor core kết nối với nhau qua một cache coherence network-on-chip. Nhưng do số core trong loại này ít hơn loại thứ hai nhiều nên network của loại thư ba này đơn giản hơn, và hiệu suất cũng cao hơn. Loại này thường dùng token ring để làm network. Loại thứ 3 này quá phổ biến nên mình chẳng cần nói nhiều. Nó đáp ứng hầu như tất cả các ứng dụng hiện nay. Điều duy nhất mình có thể nói là hầu hết các ứng dụng là single threaded và processor chỉ chạy 1 core đối với các ứng dụng này. Như vậy cho dù có 8 hay 16 core cũng chẳng có ý nghĩa gì.

                    Nói chung đánh giá và so sánh các kiến trúc vi xử lý cũng như so sánh quả cam và quả táo. Mỗi loại có những ưu điểm, nhược điểm và ứng dụng khác nhau. Mỗi người cũng có cách nhìn và đánh giá khác nhau. Cách đánh giá của mình chắc chắn không giống nhiều người, và có thể không thật sự khách quan. Nếu các bác có ý kiến khác xin hãy chia sẻ.

                    Cheers.

                    Comment


                    • #40
                      Chào bác lntran,

                      Sau khi đọc xong loạt bài giới thiệu cấu trúc vi xử lý mới của bác, em nghĩ mình cần phải tìm hiểu thêm nhiều nữa mới có khả năng lĩnh hội được. Vì vậy em tạm coi cấu trúc vi xử lý của bác thành một cái core vi xử lý và đứng trên góc độ thiết kế hệ thống (SoC) em có một vài thắc mắc mong bác sẽ trao đổi thêm:

                      (1) Cấu trúc vi xử lý của bác hoạt động không cần có clock, hay nói cách khác thay vì dùng Flip-Flop sẽ dùng Latch. Em có thể giả định như thế được không?

                      (2) Thông thường, chương trình sẽ được lưu trữ trong một bộ nhớ tạm gọi là PM (Program Memory), khi khởi động, một cấu trúc được thiết kế cứng sẽ tự động load dữ liệu từ PM để vi xử lý thực hiện các hoạt động bên trong của nó. Dữ liệu cần xử lý sẽ được lưu trữ trong một bộ nhớ, cũng tạm gọi là DM (Data Memory). Tóm lại là cần một khối làm chức năng giao tiếp giữa bộ nhớ (PM + DM) và vi xử lý, tạm gọi nó là MCU (Memory Control Unit). Nếu không phải là như vậy thì vi xử lý của bác giao tiếp như thế nào với khối bộ nhớ nhìn từ góc độ thiết kế hệ thống?

                      (3) Thông thường cách truy xuất các bộ nhớ hiện nay đều cần xung clock, nếu như vậy liệu có khi nào tốc độ của cả hệ thống sẽ bị giới hạn bởi MCU không? Và nếu bỏ clock đi sẽ rất có kiểm soát hoạt động của cả hệ thống (vi xử lý + bộ nhớ)?

                      (4) Với các cấu trúc có clock thì power sẽ được đóng góp phần lớn bởi clock, nhưng ngược lại với cấu trúc latch thì power sẽ được đóng góp phần lớn khi data thay đổi và cấu trúc của bác cho phép xử lý đồng thời, tức là data thay đổi sẽ rất nhiều vậy khi xét đến power cho cả hệ thống thì nó có thật sự là ưu điểm không?

                      Rất mong được bác làm sáng tỏ thêm.

                      Thân mến.

                      Comment


                      • #41
                        Hi bác Hithere123,

                        Cám ơn bác đã cho ý kiến. Mình rất vui được trả lời bác.

                        1. PE của mình về mặt logic thì sử dụng latch thay cho flipflop nhưng trong mạch thực sự thì hoàn toàn chẳng có latch hay flipflop nào hết mà được nối trực tiếp vào nhau. Để mình phân tích lại điểm này cho rõ hơn. Hoạt động của latch tức là khi clock ="1" output=input; khi clock="0" output remain. Mặc dù trong kiến trúc asynchronous pipeline không có một tín hiệu clock chung, nhưng mình tạm gọi tín hiệu điều khiển latch cho từng tầng là clock để dễ hiểu. Trong kiến trúc asynchronous pipeline, khi dữ liệu của tầng trước xuất hiện, Clock của tầng sau sẽ chuyển sang "1", để tầng sau lấy dữ liệu đầu vào và xử lý. Sau đó clock chuyển lại trở về "0" để tầng trước chạy dữ liệu mới không ảnh hưởng đến tầng sau. Đây là nguyên tắc hoạt động mang tính logic. Khi sử dụng Domino logic, và ghép 2 tầng lại với nhau, ta có thể hoàn toàn bỏ latch ở giữa. Nguyên tắc hoạt động của mạch như sau. Khi tầng trước chuyển Clock="1" (Evaluation state), dữ liệu sẽ được tính toán và gửi đến tầng sau. Tầng sau có Clock hiện thời ="0" (pre-charge state), dù đầu vào có thay đổi thế nào thì đầu ra của tầng sau vẫn là 0 (tương tự như khi sử dụng latch với Clock="0"). Tín hiệu clock của tầng thứ nhất được đưa qua một mạch delay (tương tự như loại dùng cho Digital DLL) để báo cho tầng sau biết đã có dữ liệu đầu vào. Khi đó Clock của tầng 2 chuyển sang "1" (Evaluation stage), tầng 2 sẽ tính toán dữ liệu mới dựa trên giá trị đầu vào. Điều này cũng tương tự như khi sử dụng Latch ở đầu vào với Clock="1". Tín hiệu Clock của tầng 2 được gửi ngược về tầng thứ nhất dùng làm handshaking signal thông báo tầng thứ 2 đã lấy dữ liệu. Khi đó Clock của tầng thứ nhất chuyển về "0", tầng thứ nhất trở về Pre-charge state. Khi đó dữ liệu ra của tầng thứ nhất hay dữ liệu vào của tầng thứ 2 trở thành "0". Tuy nhiên điều này chẳng ảnh hưởng gì đến hoạt động của tầng thứ hai vì mạch Domino logic nếu sau khi đã xả điện (do đầu vào ="1") thì sẽ không quay trở lại trang thái ban đầu nữa, nếu không xả điện (đầu vào ="0") thì vẫn tiếp tục không xả điện. Sau khi dữ liệu ra của tầng thứ 2 được tầng thứ 3 lấy, tín hiệu clock của tầng lại chuyển về "0" và mạch ở trạng thái Pre-charge, chờ dữ liệu đầu vào. Như bác có thể thấy, khi ghép các tầng Domino logic đan xen nhau, và một cách điều khiển tín hiệu clock cho từng tầng hợp lý, mạch chạy tương tự như có latch ở giữa các tầng (mặc dù chẳng có latch nào hết). Điều này rất quan trọng vì latch có diện tích lớn, và có delay tương đối cao. Loại bỏ hoàn toàn latch làm giảm diện tích, cũng như latency của mạch. Mạch điều khiển tạo tín hiệu clock cho từng tầng được tạo nên từ phần tử C-Muller gate. Khi mạch gồm nhiều tầng đầu vào, và đẩy ra nhiều đầu ra (ví dụ ALU) mạch điều khiển tạo tín hiệu clock sẽ phức tạp hơn nhiều nhưng cũng được cấu thành từ các C-muller gate.

                        2+3. Bác nói chính xác Processor cần có một MCU điều khiển bộ nhớ và IO controller điều khiển PCI express connection link. Loại này bắt buộc phải sử dụng clock và memory và IO device đều dùng clock. Khi đó trong mạch phải có một Synchronous/Asynchronous Interface. Dữ liệu được truyền qua hai miền này thông qua buffer hoặc trực tiếp lên cache. Khi đó có thể xảy ra vấn đề về metalstability và mạch hoạt động có thể bị lỗi. Về nguyên tắc hoàn toàn không có khả năng loại bỏ metalstability trong trường hợp này nhưng ta có thể làm giảm xác suất xảy ra đến mức rất nhỏ. Cũng về mặt lý thuyết ta có thể tăng Mean Time Between Failure (MTBF) lên đến hàng nghìn năm, và điều này hoàn toàn đáp ứng được yêu cầu của máy chủ. Việc trao đổi dữ liệu giữa 2 miền synchronous và asynchronous đã được nhiều người nghiên cứu trước nên nếu cần mình cũng chỉ việc đem ra áp dụng lại. Nhân tiện đây mình cũng muốn nói thêm thực tế việc sử dụng PLL, DLL để đồng bộ 2 clock riêng biệt trên 2 domain cũng có xác suất xảy ra metalstability chứ không phải không có như nhiều người nghĩ. Tuy nhiên xác suất này quá nhỏ nên mọi người ít để ý.

                        4. Nếu mạch logic chuyển trạng thái thì đương nhiên nó tiêu thụ công suất rồi. Nhưng trong các mạch logic sử dụng Clock tree, tín hiệu clock không dùng để tính toán dữ liệu gì những lại liên tục thay đổi trạng thái "0", và "1" (trừ trường hợp sử dụng clock gating). Thêm vào đó để giảm nhỏ clock screw do output load (output capacitance) của clock buffer khác nhau, các clock buffer trên clock tree rất lớn và rất strong. Tính tổng thể Clock tree mặc dù chẳng tính toán dữ liệu gì những tiệu thụ lên đến khoảng 40% công suất trong các mạch vi xử lý. Trong kiến trúc mạch của mình, yêu cầu về clock screw không có nên mạch tạo tín hiệu handshaking không cần phải quá strong. Bên cạnh đó mạch chỉ thay đổi trang thái khi có dữ liệu đầu vào, còn những lúc khác mạch đều chuyển về trạng thái pre-charge không thay đổi liên tục nên đương nhiên công suất sẽ giảm đi rất nhiều.

                        Cheers.

                        Comment


                        • #42
                          Chào bác lntran,

                          Cám ơn bác đã làm sáng tỏ một số thắc mắc của em. Tuy nhiên em muốn trao đổi thêm một chút về khía cạnh tiết kiệm power. Đúng như bác nói tác nhân đóng góp nhiều nhất là các buffer trong clock tree. Ngay cả khi chúng ta sử dụng option clock_gating khi synthesis thì vẫn không có tác dụng mấy vì nó được công cụ synthesis tự động optimize theo từng bó (nên buffer vẫn tiêu tốn power khi clock chạy). Em hay dùng cách khác, đó là thiết kế thêm một khối clock gating ở ngay chân input clock cho toàn module, tuy nhiên sẽ cần thêm một mạch để phát hiện khi nào khối chức năng bắt đầu hoạt động để bật clock và khi nào khối chức năng đó không thực sự hoạt động để tắt clock. Sau khi thực hiện xong khối này thì em thấy power của module giảm xuống ~30%, vậy là cũng gần gần với con số ước lượng 40% mà bác đưa ra. Do đó, em vẫn giữ quan điểm cũ, liệu tiết kiệm power có thật sự là/có nên đưa thành ưu điểm chính trong cấu trúc của bác so với các cấu trúc khác (với điều kiện làm tốt vấn đề clock gating) không? Mong bác chú ý thêm ở đặc điểm này vì đây là một ưu điểm rất có giá trị.

                          Như đã nói ở một bài viết trước, em nghĩ cũng nên nói thêm một chút theo nhận xét cá nhân về vấn đề patent.

                          Nguyên văn bởi hithere123 Xem bài viết
                          Về patent thì em e là làm loãng topic nên sẽ có ý kiến với các bác sau, đợi bác lntran nói hết patent của bác ấy đã.
                          Trong công ty em làm, một IC cùng loại nhưng có > 30% mạch thay đổi so với IC đời trước, thì bắt buộc phải có vài patent để bảo vệ nó, thậm chí chỉ có cái mạch phát hiện khi nào có/không có điện áp xoay chiều ở input cũng đăng ký một patent. Quan trọng là các thằng đối thủ cạnh tranh chưa có thằng nào đăng ký patent về cái này là được. Và công ty cũng có hẳn một ban chuyên về cái anh patent này, ở Mỹ em có người bạn cũng học để chuyên làm về cái này. Thế nên việc bác lntran nói là bác ấy đã đăng ký patent cho cấu trúc vi xử lý này, em nghĩ đây là việc làm rất chuyên nghiệp.

                          Còn ở Việt Nam em biết trong cộng đồng làm điện tử, nhất là ứng dụng liên quan đến vi điều khiển/vi xử lý có một dạo rất ngại chia sẻ, cũng chỉ vì mình vừa có ý tưởng về một ứng dụng nào đó (LED chạy chữ/quảng cáo, module thu phát, ..) chẳng hạn, viết xong, test thử chạy đúng, vui quá nói chuyện với một vài người thì không hiểu sao một thời gian sau, nó không còn là của mình nữa (còn cả vấn đề đọc ngược lại code nữa.) Kết quả là mọi người sau đó khá nhạy cảm với vấn đề này.

                          Em đề cập đến khía cạnh này cũng là vì em thấy phản ứng của các bác ở mấy trang đầu là theo hướng khá “nhạy cảm” khi bác lntran nêu ra vấn đề. Còn bác tonyvandinh cũng chỉ là đùa vui vì bác ấy làm ở nước ngoài nên chuyện patent nó rất quen thuộc rồi. Rất mong các bác hãy bỏ qua những nghi ngại lúc ban đầu để cùng nhau góp sức vì lợi ích chung.

                          Thân mến.

                          Comment


                          • #43
                            Hi các bác

                            Thật ra mạch chạy tiết kiệm power bao nhiêu thì phải thiết kế cụ thể ra mới biết được. Những đánh giá của mình cũng chỉ là lý thuyết thôi. Nhưng các bác có thể thấy rằng clock tree tiêu thụ đến 40% công suất toàn mạch trong khi thiết kế của mình lại loại bỏ việc sử dụng clock tree và thay bằng các mạch handshaking. Các mạch handshaking không có yêu cầu cao về clock screw nên không cần phải quá strong như clock buffer. Nếu các mạch handshaking tiêu thụ khoảng 10% công suất thì có nghĩa chúng ta đã tiết kiệm được 30% công suất rồi.

                            Nhân tiện đây mình nói về low power design. Cái này mình cũng có một chút experience vì mình hoc nhiều về nó, ngày xưa Qimonda là hãng làm bộ nhớ nổi tiếng về low power dành cho máy chủ (một phần nhờ sử dụng technology Deep Trench Capacitor, về sau là Buried Wordline), còn bấy giờ làm cho Broadcom sản xuất chip cho cell phone. Mấy cái kỹ thuật low power design như power gating, clock gating... thì chắc các bác biết hết rồi nên mình chỉ nói vài thứ mình rất tâm đắc.

                            Điều thứ nhất mình nhận thấy là các kỹ sư hiện nay thiết kế chip quá kém về mặt tiết kiệm công suất. Điều này thật sự mọi người đều biết cả nhưng chẳng biết phải làm sao. Đây là số liệu đo thực tế trên 3 máy chủ HP (Xeon E5440, 8 core 2 processor, 3 GHz, 8GB memory), Dell (Xeon E5440 8 core 2 processor, 2.8GHz, 8 GB memory), Fujitsu Siemens (Xeon X3220, 4 core 1 processor, 2.4 GHz, 4 GB memory):

                            100% Load: HP 269W, Dell 230W, FS 132W
                            50% Load: HP 227W (84%), Dell 230W (83%), FS 110W (83%)
                            10% Load: HP 174W (65%), Dell 173W (63%), FS 85W (65%)
                            0% Load: HP 150W (59%), Dell 157W (57%), FS 80W (60%)

                            Người ta cũng nhận thấy thời gian máy chủ chạy 100% công suất <1%. Như vậy có thể nói máy chủ tiêu thụ rất nhiều công suất vô nghĩa.

                            Ngoại trừ các kỹ thuật thông dụng để tiết kiệm công suất mà các bác có thể tìm thấy rất nhiều trên mạng, có 2 kỹ thuật mà mình tâm đắc nhất là parallelism và locality.

                            Trước hết mình xin nói về parallelism. Trước đây mọi người thường tăng tần số đồng hồ để mạch có thể chạy nhanh hơn. Hiện nay điều này không đơn giản như vậy nữa. Giả sử như chúng ta sử dụng một công nghệ có delay voltage product là hằng số (giả thiết này tương đối hợp lý), để tăng tần số lên gấp đôi (hiệu suất gấp 2 lần), ta phải giảm delay 2 lần. Để giảm delay 2 lần ta phải tăng điện áp 2 lần. Điều này nghĩa là active power tăng 8 lần vì P=K*F*C*V*V (F là tần số, V là điện áp). Ngoài ra leakage current tăng theo hàm mũ so với điện áp. Thay vào đó nếu ta có thể xử lý song song, công suất tiêu thụ chỉ tăng 2 lần (như diện tích chip cũng tăng 2 lần). Vậy nên hiện nay nhiều người thường thiết kế các mạch chạy song song với điện áp thấp tần số thấp.

                            Điều thứ hai mình tâm đắc nhất là locality. Với các công nghệ mới kích thước của các đường kết nối trở nên quá nhỏ nên việc truyền dữ liệu ở khoảng cách xa tiêu thụ công suất nhiều hơn các hoạt động chuyển mạch, tính toán hàng trăm lần. Thêm vào đó có một thực tế là hiện nay việc truyền tín hiệu trên các đường kết nối cực kỳ kém hiệu quả về mặt công suất. Về mặt lý thuyết năng lượng để truyền một 1 là KTln(2) trong đó K là hằng số Bozeman, T là nhiệt độ tuyệt đối (tức là vào khoảng 4 nhân 10 mũ trừ 21 Joule), trong khi đó công nghệ 90nm truyền 1 bit với khoảng cách 1mm là 200fJ. Chính vì vậy các thiết kế hiện nay hạn chế những đường kết nối xa càng nhiều càng tốt. (Mình nói thiết kế hiện nay quá kém không phải mình chê bai mọi người vì bản thân mình cũng chẳng biết làm thế nào khác, nhưng nói ra để mọi người hiểu được thực tế của vấn đề).

                            Có một điều này mình cũng muốn trao đổi với mọi người là nhiều khi thiết kế low power phải nhìn tổng thể toàn bộ hệ thống. Các bác biết là hiện nay các hãng chế tạo thường cung cấp 2 công nghệ LP (Low Power) và GP (General Purpose). Transistor được chế tạo bởi LP có Gate oxide thickness lớn hơn nên giảm được gate leakage current, Threshold voltage cũng lớn hơn nên giảm được sub-threshold leakage current, nhưng các transistor nay chạy chậm hơn loại dùng công nghệ GP. Điều này hoàn toàn không có nghĩa mạch thiết kế bằng LP tiêu thụ công suất thấp hơn GP. Công nghệ LP thường được dùng để chế tạo các chip thường hoạt động ở chế độ standby ví dụ cho cell phone. Khi đó leakage current của loại này nhỏ hơn thật. Nhưng trong chế độ active, do mạch sử dụng GP có tốc độ cao nên ta có thể giảm điện áp nguồn nhưng vẫn đảm bảo tần số hoạt động và các mạch GP tiêu thụ ít công suất hơn loại LP. Cũng tương tự như vậy có 3 loại transistor (high, low, standard threshold voltage). Trong nhiều trường hợp không phải mạch sử dụng high VT chạy ít công suất hơn mạch low VT. Điều này thật sự không mới nhưng nhiều người làm thiết kế vẫn nhầm lẫn. Với những người không chuyên thì việc hiểu lầm này lại quá rộng rãi. Vậy nên mình muốn đính chính lại cho chính xác.

                            Hồi mới mở topic này mình bị mọi người vào đả kích nhiều quá thấy cũng hơi buồn. Không biết có phải mình bây giờ không cùng suy nghĩ với nhưng người làm việc ở VN không. Quả thật mình thấy những thứ mình làm ở đây khác với mọi người quá. Ở bên này mình chẳng thấy mấy ai quan tâm đến việc làm PCB vì mấy thứ đó cho máy làm, và các linh kiện đều nhỏ xíu. Kỹ sư cũng chẳng cần phải chọc ngoái hàn, tháo linh kiện vì đã có technical làm rồi. Còn mấy con vi điều khiển mà nhiều người thảo luận mình cũng chẳng thấy ở đây sử dụng. Nếu như các bác sinh viên muốn về sau ra nước ngoài làm việc, kiếm tiền mình thấy nên quên mấy thứ primitive này đi. Mình sẽ có gắng hết sức trao đổi với các bác những kiến thức hiện đại của nước ngoài. Nhưng mình cũng muốn các bác ủng hộ và cổ vũ.

                            Cheers.

                            Comment


                            • #44
                              Nguyên văn bởi lntran Xem bài viết
                              Hi các bác

                              Hồi mới mở topic này mình bị mọi người vào đả kích nhiều quá thấy cũng hơi buồn. Không biết có phải mình bây giờ không cùng suy nghĩ với nhưng người làm việc ở VN không. Quả thật mình thấy những thứ mình làm ở đây khác với mọi người quá. Ở bên này mình chẳng thấy mấy ai quan tâm đến việc làm PCB vì mấy thứ đó cho máy làm, và các linh kiện đều nhỏ xíu. Kỹ sư cũng chẳng cần phải chọc ngoái hàn, tháo linh kiện vì đã có technical làm rồi. Còn mấy con vi điều khiển mà nhiều người thảo luận mình cũng chẳng thấy ở đây sử dụng. Nếu như các bác sinh viên muốn về sau ra nước ngoài làm việc, kiếm tiền mình thấy nên quên mấy thứ primitive này đi. Mình sẽ có gắng hết sức trao đổi với các bác những kiến thức hiện đại của nước ngoài. Nhưng mình cũng muốn các bác ủng hộ và cổ vũ.

                              Cheers.
                              Anh Intran ơi, có lẽ anh sống ở nước ngoài nhiều quá nên tinh thần dần dần cũng chẳng còn gì chăng, Bên này (ngoài Việt Nam) và bên đó (Việt Nam) không phải chỉ khác nhau hay chữ này và đó không đâu anh ơi, cách xa 2 bờ đại dương lận, có phải 2 bờ sông đâu ?. Anh và những người khác sống ở hai môi trường khác nhau thì đừng có bảo kĩ sư ở đây không phải làm cái này, không phải làm cái nọ. Kĩ sư thực sự của Việt Nam cam đoan với bác là giỏi hơn Kĩ sư của Mĩ, Nhật gấp nhiều lần. Đơn giản vì Kĩ sư Việt Nam dựa trên nền tảng là sự thiếu thốn đủ thứ và gò bó đủ thứ để làm việc còn Kĩ sư nước ngoài thì dựa trên sự thừa thải. Kĩ sư thực sự của Việt Nam là người đam mê kĩ thuật trong hoàn cảnh khó khăn còn kĩ sư nước ngoài thì đam mê vì được đào tạo như vậy, linh tinh quá chắc anh không hiểu.
                              Cái mà cần bỏ không phải là mấy cái con vi điều khiển ở đây mà là tấc cả những trò nhảm nhí như ROBOCON, nếu bác có lòng thì giúp đỡ mọi người tiếp xúc với kiến thức đúng nghĩa chứ không phải với suy nghĩ cá nhân của bác. Tiếp xúc với kiến thức là tốt nhưng đặt mục tiêu tiếp xúc để kiếm tiền thì thật sự là tệ hại quá bác nhỉ,
                              Vài lời nhảm nhí của thằng em / thằng cháu lạ hoắc, em chằng học hành gì nhiều nên chữ viết sai tới sai lui mong anh thông cảm. Cuối cùng tóm lại: rất hoan nghênh anh chia sẻ kiếm thức nhưng mong anh đừng dạy cho các bạn sinh viên "kiếm tiền bằng mọi giá, kể cả cái cách đi nước ngoài, rời bỏ quê hương mình", cuối cùng nước việt nam sẽ chỉ còn lại những con người lao đầu đi kiếm tiền, nếu lời nói của anh làm một ai đó tin tưởng và học theo để cũng bay đi nước mỹ nước đức gì đó mà cống hiến, liệu anh thấy vui hay thấy buồn ?

                              Comment


                              • #45
                                Hồi mới mở topic này mình bị mọi người vào đả kích nhiều quá thấy cũng hơi buồn. Không biết có phải mình bây giờ không cùng suy nghĩ với nhưng người làm việc ở VN không. Quả thật mình thấy những thứ mình làm ở đây khác với mọi người quá. Ở bên này mình chẳng thấy mấy ai quan tâm đến việc làm PCB vì mấy thứ đó cho máy làm, và các linh kiện đều nhỏ xíu. Kỹ sư cũng chẳng cần phải chọc ngoái hàn, tháo linh kiện vì đã có technical làm rồi. Còn mấy con vi điều khiển mà nhiều người thảo luận mình cũng chẳng thấy ở đây sử dụng. Nếu như các bác sinh viên muốn về sau ra nước ngoài làm việc, kiếm tiền mình thấy nên quên mấy thứ primitive này đi. Mình sẽ có gắng hết sức trao đổi với các bác những kiến thức hiện đại của nước ngoài. Nhưng mình cũng muốn các bác ủng hộ và cổ vũ.
                                Tại làm cho Broadcom cho nên mới không biết là vẫn có nhiều người làm PCB để Broadcom chip có chỗ nương tựa mà chạy chứ. Công việc nào cũng có cái thử thách riêng của nó và cái hay của nó. Những cái đơn giản nhiều khi tạo ra tiền nhiều hơn là những cái phức tạp. Google, Ebay, Facebook và vân vân đâu có cần làm chip đâu mà vẫn nổi tiếng và hốt tiền như rác. Cứ thực tế mà sống là tốt rồi
                                Chúc một ngày vui vẻ
                                Tony
                                email : dientu_vip@yahoo.com

                                Comment

                                Về tác giả

                                Collapse

                                lntran Tìm hiểu thêm về lntran

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X