31 điểm bởi GN⁺ 2025-06-10 | 2 bình luận | Chia sẻ qua WhatsApp
  • Muốn biết nên học sách/khóa học/dự án nào để học lập trình CUDA (vì nhiều công ty muốn ứng tuyển yêu cầu kinh nghiệm CUDA)

Tổng hợp các câu trả lời từ HN

  • Tài liệu học tập và bước khởi đầu

    • Khuyến nghị CUDA Programming Guide chính thức của NVIDIAkho sách lưu trữ của NVIDIA
    • Bắt đầu từ các chương trình ví dụ nhỏ rồi dần luyện tập song song hóa, kiến thức C/C++ sẵn có là rất quan trọng
    • Tận dụng mã nguồn mở (GitHub, v.v.) và LLM (ví dụ: ChatGPT) để phân tích cấu trúc mã và thực hành
    • Khuyến nghị tiếp cận theo hướng thực hành với kế hoạch khoảng 6–8 tuần
  • Phần cứng và môi trường cần thiết

    • GPU NVIDIA trong vòng 10 năm gần đây là đủ dùng (đặc biệt là Turing/RTX 20xx, Ampere/RTX 30xx trở lên); dòng cũ hơn (trước Maxwell) có hạn chế về hỗ trợ và hiệu năng
    • Dùng phiên bản mới nhất của CUDA Toolkit, bắt buộc kiểm tra Compute Capability của GPU (xem bảng hỗ trợ)
    • Có thể dùng cả Windows và Linux; tùy môi trường cũng có thể tận dụng Docker và VPS
    • Nếu không có GPU, có thể trải nghiệm qua các trình giả lập trực tuyến như leetgpu.com
  • Nền tảng lập trình song song

    • Quan trọng hơn cú pháp CUDA là việc hiểu thuật toán song song và kiến trúc phần cứng
    • Sách tiêu biểu:
      • Programming Massively Parallel Processors (PMPP)
      • Foundations of Multithreaded, Parallel, and Distributed Programming
      • Scientific Parallel Computing
      • The Art of High Performance Computing (Victor Eijkhout, miễn phí)
    • Nhu cầu thực tế trong công việc với CUDA thường tập trung vào khai thác các thư viện dựa trên CUDA như cuBLAS, cuDNN và tối đa hóa hiệu năng song song
  • Phương pháp học

    • Thay vì chỉ học cú pháp, nên theo hướng port các đoạn mã CPU nhỏ sang CUDA → benchmark hiệu năng → tối ưu hóa dần dần
    • Ban đầu ưu tiên tính đúng đắn, sau đó áp dụng tối ưu hiệu năng theo từng bước (quản lý bộ nhớ, shared memory, sử dụng register, v.v.)
    • Ví dụ thực hành: prefix scan, GEMM, n-body simulation và các thuật toán song song kinh điển tương tự
    • Nên học trước các thư viện trừu tượng mức cao như CUDA Thrust, CUTLASS, cub; phần tự hiện thực có thể thử sau
  • Công việc thực tế và sự nghiệp

    • Yêu cầu kinh nghiệm CUDA chủ yếu xuất hiện trong deep learning, data engineering, HPC (tính toán khoa học), đồ họa game, v.v.
    • Có những vị trí không chỉ cần PyTorch/Tensorflow mà còn yêu cầu kinh nghiệm tối ưu hóa kernel/thư viện CUDA cốt lõi
    • Để xây dựng chuyên môn thực tế, khả năng dùng các công cụ low-level như PTX, nvcc, cuobjdump, Nsight Systems/Compute cũng rất quan trọng
    • Tham gia cộng đồng: gpumode Discord, GPU Puzzles và các cộng đồng sôi nổi khác để review mã thực chiến và thảo luận
  • Lưu ý và lời khuyên thực tế

    • Bắt đầu thì dễ, nhưng tối ưu theo từng phần cứng (kiến trúc/tập lệnh) và đảm bảo tương thích là rất khó, rào cản gia nhập cao
    • Trên thực tế, kinh nghiệm nghề nghiệp và mạng lưới quan hệ rất quan trọng; tự học đơn thuần không thể thay thế hoàn toàn kinh nghiệm làm việc thực tế
    • CUDA là lĩnh vực nơi phần cứng/tính toán song song/thuật toán/tối ưu hóa gắn chặt với nhau, nên khuyến nghị tập trung sâu vào một mảng

2 bình luận

 
ahwjdekf 2025-06-12

Chà. Không biết liệu có khi nào phải trực tiếp dùng CUDA hay không. Đặc biệt là ở Hàn Quốc.

 
GN⁺ 2025-06-10
Bình luận trên Hacker News
  • Với kinh nghiệm từng tham gia NVidia cudacontest năm 2008, là một trong số ít người nộp bài từ Ấn Độ và còn nhận được giải tham dự BlackEdition Card, tôi chia sẻ cách mình đã đi theo

    • Tham khảo NVidia CUDA Programming Guide
    • Tận dụng các sách về CUDA Programming do NVidia phát hành (xem developer.nvidia.com/cuda-books-archive)
    • Bắt đầu viết từ những chương trình nhỏ dựa trên các triển khai có sẵn (cần nền tảng C thật vững, nên ôn lại nếu cần)
    • Giả định đã cài toolchain, compiler cần thiết và có phần cứng để làm việc
    • Phân tích mã nguồn các dự án CUDA trên Github, và hiện nay có thể dùng LLM để nhờ giải thích code
    • Bắt đầu từ các chương trình nhỏ nhưng dựa trên xử lý song song rồi mở rộng dần
    • Nếu tiến hành đều đặn trong 1–2 tháng thì hoàn toàn có thể bắt đầu lập trình CUDA
    • Hiện nay môi trường có nhiều tài liệu và tài nguyên hơn rất nhiều so với 2007/08
    • Khuyến nghị lập kế hoạch học trong 6–8 tuần rồi thực hiện
    • Nếu để lại câu hỏi thì tôi có thể cố gắng hỗ trợ trong khả năng
      • Muốn hỏi cụ thể về phần cứng cần thiết. Chỉ cần một card đồ họa nvidia ra mắt khoảng 5 năm trước là đủ hay cần cấu hình đặc biệt hơn?
      • Cũng muốn biết mọi người dùng môi trường phát triển nào. Windows vẫn còn là môi trường phát triển chính cho CUDA hay không?
  • Khi trực tiếp xem mã CUDA của Leela Chess Zero thì thấy ở mức có thể hiểu được

    • Khi đó Leela dùng kiến trúc DCNN thay vì transformer, và tôi đã học nền tảng DCNN khá dễ qua video của fast.ai
    • Transformer phức tạp hơn nên tôi vẫn chưa bắt đầu học
    • Bản thân ngôn ngữ CUDA dựa trên C++, nên nếu có kinh nghiệm C++ thì không quá khó để tiếp cận
    • Tuy nhiên nếu muốn trở thành lập trình viên CUDA thì khả năng cao vẫn phải đạt tới mức lập trình AI—mà AI là một lĩnh vực sâu và rộng hơn CUDA rất nhiều, đòi hỏi nhiều thời gian và kinh nghiệm thực chiến
    • Dù vậy, một khi đã có năng lực thì nhu cầu thị trường rất cao
    • Rất khuyến nghị video của fast.ai
    • Nếu là mảng game thì câu chuyện còn nối sang cả đồ họa 3D, mà gần đây đã trở nên phức tạp hơn nhiều nên tôi cũng không rõ lộ trình nhập môn
      • Hỏi liệu tìm việc với vai trò lập trình viên CUDA hiện có bớt áp lực hơn các mảng kỹ sư phần mềm khác không. Với vị trí hiện tại là lập trình viên middleware Java, có ý kiến cho rằng chuyển sang CUDA và AI có thể tốt cho sự nghiệp
      • Muốn xác nhận có phải đoạn code này là ở đây không, và có hai câu hỏi cho người mới
        • Vì sao lại viết trực tiếp bằng C++/CUDA, có phải chỉ dùng pytorch hay tensorflow thì tốc độ huấn luyện của Leela không đủ không?
        • Và còn có cả mã tensorflow, vậy lý do là gì?
  • Nếu động lực là tiền bạc thì khuyên nên bỏ qua mảng HPC và các lĩnh vực nặng về toán

    • Trong lĩnh vực này, nếu không ở mức tiến sĩ thì dù giỏi đến đâu cũng khó được chú ý
    • Những năng lực thực sự tạo ra giá trị tiền bạc là làm chủ các công cụ như PTX, nvcc, cuobjdump, Nsight Systems, Nsight Compute, và phân tích các codebase mã nguồn mở như CUTLASS
    • Khuyến nghị tham khảo ghi chú thực chiến liên quan
    • Trên hết, đừng chỉ ở lại trên HN mà hãy tham gia cộng đồng discord gpu mode, nơi có các lập trình viên thực sự đang hoạt động
      • Nghe có vẻ hay và rất thực tế, nhưng cũng có vẻ là một lĩnh vực cực kỳ ngách
      • Bản thân việc gia nhập đã khó, và dường như chỉ được dùng trong các lĩnh vực hạn chế như ngành game, driver, v.v.
      • Có nhắc rằng nếu muốn đi thẳng tới cấp độ đó ngay từ đầu thì sẽ cần năng khiếu rất lớn
  • gpumode.com và cộng đồng Discord của họ có thể cung cấp đủ nội dung để học trong nhiều tháng

    • Sách Programming massively parallel processors
    • Tài liệu chính thức của nvidia cuda rất toàn diện
    • Cũng khuyến nghị thử GPU-Puzzles
      • Nhìn vào ví dụ code flashattention-2 của ThunderKittens thì có thể cảm nhận được mức độ phức tạp của code mà khó diễn tả bằng lời
      • Có ý kiến cho rằng các câu đố kiểu này mang tính 'được ăn cả, ngã về không', chênh lệch thành quả thực tế chỉ dưới 1%, nên bản thân việc luyện các bài này không có nhiều ý nghĩa
  • Khuyến nghị chia nhỏ phạm vi học để dễ tiếp cận hơn

      1. Học chính CUDA (framework/thư viện/lớp trừu tượng)
      1. Nền tảng của tính toán hiệu năng cao (không chỉ dừng ở khái niệm GPU hay Nvlink mà áp dụng cho toàn bộ kiến trúc HPC)
      1. Chuyên sâu theo lĩnh vực ứng dụng (nếu là Transformer thì bắt đầu từ các trừu tượng mức cao hiện đại như Torch, Tensorflow, v.v.)
    • Nếu thực sự muốn làm chủ CUDA, cốt lõi là trải nghiệm và hiểu nguyên lý lập trình xử lý song song quy mô lớn, và phần lớn kỹ năng này có thể chuyển đổi sang nơi khác
      • Là cựu lập trình viên GPU, tôi cũng đưa lời khuyên tương tự, đặc biệt nhấn mạnh mục 2 và 3
      • Tùy mục tiêu việc làm, nhưng thứ thực sự cần có có thể là kinh nghiệm với các thư viện CUDA (cuDNN, cuBLAS, cuFFT, v.v.)
      • Điều quan trọng nhất vẫn là hiểu nguyên lý lập trình song song
      • Đây là cách tiếp cận đúng, và nếu học thẳng từ mục 1 mà không có mục 2 thì chỉ càng rối hơn
      • Giới thiệu sách khuyến nghị
  • Chia sẻ trải nghiệm cá nhân trong quá trình học CUDA

    • Không thật sự bài bản, nhưng là cách đã giúp ích cho học thuật và nghiên cứu của tôi
    • Tôi buộc phải tự học CUDA vì dự án tiến sĩ
    • Trong phòng lab không có ai có kinh nghiệm, nên tôi học nền tảng khái niệm qua các khóa cơ bản của NVIDIA (Getting Started with Accelerated Computing with CUDA C/C++ và bản python)
    • Ngoài tutorial chính thức, trên thực tế phần lớn việc học đến từ thử và sai
    • Tôi cũng dùng tutorial online và sách, nhưng hàm và API thay đổi rất nhanh nên thường xuyên bị lẫn giữa bản cũ/bản mới, lại còn phải để ý các vấn đề tương thích giữa GPU của mình và môi trường thực tế
    • Phần khó nhất là hầu hết thời gian bị dành cho việc debug (truy tìm nguyên nhân chạy chậm hơn dự kiến) và sử dụng công cụ (ví dụ: compute-sanitizer, Nsight)
    • Khuyên đừng nóng vội, hãy lấy một dự án đơn giản chạy trên CPU rồi port sang CUDA, benchmark và tích lũy kinh nghiệm tối ưu hóa
    • Tối ưu hóa hãy để sau cùng, trước hết phải ưu tiên làm cho nó chạy đúng
    • Một kernel chạy chậm nhưng không làm hỏng bộ nhớ còn đáng giá hơn một kernel đã tối ưu hóa
      • Chia sẻ trải nghiệm tiến sĩ tương tự—kết quả thực hành flashrnn
      • Nếu đã hiểu các nguyên lý cơ bản và cấu trúc GPU, đây là workflow được khuyến nghị
        1. Thiết lập môi trường có thể test kernel, rồi so sánh với baseline viết bằng ngôn ngữ cấp cao hơn
        2. Nếu không có dự án gấp, hãy ôn lại hoặc tự triển khai các bài toán kinh điển sẵn có (MatMul, v.v.)—đừng cố làm mọi trường hợp, hãy tập trung theo từng tính năng
        3. Tăng dần độ phức tạp—loop, song song hóa theo grid, rồi lần lượt dùng bộ nhớ global/shared/register, và mở rộng từ nhân ma trận đơn giản tới TensorCore (MMA)
        4. Đọc đi đọc lại CUDA C Programming Guide—chỉ khi vừa thực hành vừa đọc mới thực sự ngấm
        5. Các trừu tượng mức cao hơn như CUTLASS, ThunderKitten cũng đáng dùng tùy trường hợp; nếu ở môi trường JAX/Torch thì nên ưu tiên triton
      • Nếu muốn làm chủ cả PTX thì sẽ mất nhiều thời gian hơn, nhưng vẫn nhấn mạnh quá trình học qua va chạm thực tế
      • Rất đồng cảm với nỗi đau debug hiệu năng CUDA
  • Giới thiệu tài liệu từng dùng khi dạy CUDA cho học sinh trung học—không đủ để tự mình làm chủ toàn bộ, nhưng hữu ích cho bước khởi đầu

  • Tôi chưa dùng thử, nhưng thấy khá ổn nên muốn giới thiệu nền tảng leetgpu.com

  • Muốn xin ý kiến từ người trong nghề về các công việc, vị trí và nhóm công ty đang tuyển kỹ sư CUDA

    • Hiện tại nhiều công ty dùng các thư viện dựa trên CUDA như PyTorch, nhưng tôi không rõ có nhiều công ty thật sự cần phát triển CUDA native hay không
    • Hy vọng tìm ra những tổ chức hoặc vai trò làm việc trực tiếp xoay quanh CUDA
      • Với đội của chúng tôi, CUDA được dùng trực tiếp để phân tích dữ liệu địa không gian (geospatial)
      • Raster hóa các tile của slippy map rồi xử lý tóm tắt raster trên GPU
      • Phần lớn là xử lý độc lập theo từng pixel nên rất hợp với GPU
      • Tóm tắt song song theo từng hàng rồi gom lại xử lý ở bước cuối
      • Tuy nhiên hiện tại việc copy dữ liệu sang GPU đang là nút thắt cổ chai
  • Theo sự thay đổi của thời đại, có thể tận dụng cách hỏi LLM như Claude để nhận đồng thời code kết quả và lời giải thích

    • Có ý kiến rằng trong năm 2025 làm vậy vẫn còn hiệu quả, nhưng sang 2026 sẽ cần nhiều hơn một cấp độ nữa