2011-09-12 51 views
6

Tôi mới đến GPU Lập trình trên thế giới, tôi đã cố gắng đọc trên Wikipedia và Googling, nhưng tôi vẫn có một số câu hỏi:Lập trình GPU?

  • Tôi đã tải về một số GPU Ví dụ, đối với CUDA, đã có một số .cu các tệp và một số tệp CPP, nhưng tất cả mã là mã C/C++ bình thường chỉ là một số hàm lạ như cudaMemcpyToSymbol và phần còn lại là mã c thuần túy. Câu hỏi đặt ra là mã .cu được biên dịch với nvcc và sau đó được liên kết với gcc? Hoặc nó được lập trình như thế nào?

  • nếu tôi mã hóa nội dung nào đó chạy trên GPU, nó có chạy trên TẤT CẢ GPU không? hay chỉ là CUDA? hoặc là có một phương pháp để viết cho CUDA và một phương pháp để viết cho ATI và một phương pháp để viết cho cả hai?

Trả lời

10

Để trả lời q thứ hai của bạn uestion:

OpenCL là (chỉ) cách để đi nếu bạn muốn viết mã GPGPU độc lập nền tảng.

Trang web ATIs thực sự có nhiều tài nguyên cho OpenCL nếu bạn tìm kiếm một chút và dự án mẫu của họ rất dễ sửa đổi thành những gì bạn cần hoặc chỉ để hiểu mã.

Các OpenCL spec và tham khảo trang cũng là một nguồn rất tốt về kiến ​​thức: http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/ http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf

Có rất nhiều các cuộc đàm phán để giải thích một số khái niệm cốt lõi, và cũng giải thích làm thế nào để viết mã nhanh mà tôi muốn giới thiệu (cũng có thể áp dụng cho CUDA).

Để gần như trả lời câu hỏi đầu tiên của bạn: Trong OpenCL, mã được biên dịch trong thời gian chạy tới GPU cụ thể bạn đang sử dụng (để đảm bảo tốc độ).

+0

Biên dịch khi chạy? mã của tôi sẽ giống như một mã byte được sao chép vào bộ nhớ trong thời gian chạy và được thực thi từ đó? – killercode

+0

Mã GPGPU của bạn sẽ là một chuỗi mã nguồn được biên dịch theo thời gian chạy đến một đối tượng mã trên GPU – nulvinge

5

Bạn có thể muốn đọc một số thông tin cơ bản về CUDA - đây không phải là thứ bạn có thể chọn bằng cách xem một vài mẫu mã. Hiện có khoảng 3 cuốn sách CUDA khác nhau trên Amazon, và có rất nhiều tài liệu tham khảo tại http://developer.nvidia.com.

Để trả lời câu hỏi của bạn:

  • có, file .cu được biên soạn với nvcc đến một hình thức trung gian (PTX) - điều này sau đó được chuyển đổi sang mã GPU cụ thể tại thời gian chạy

  • mã được tạo ra sẽ chạy trên một tập hợp con của nVidia GPU, kích thước của các tập con tùy thuộc vào những gì khả năng CUDA bạn sử dụng trong mã của bạn

+0

Ngoài việc liên kết: có, bạn có thể liên kết các tệp '.o' được tạo bởi' nvcc' với trình biên dịch 'gcc' hoặc trình biên dịch C (++) khác. Tuy nhiên, trong hầu hết các trường hợp, việc liên kết với 'nvcc' dễ dàng hơn, vì nó tự động liên kết chương trình của bạn với tất cả các thư viện cuda cần thiết (nếu bạn sử dụng' gcc', bạn sẽ phải chỉ định chúng theo cách thủ công). – aland

3

hoàn thành câu trả lời được đưa ra bởi @nulvinge, tôi muốn nói rằng OpenCL với Lập trình GPU như OpenGL là GPU Rendering. Nhưng nó không phải là lựa chọn duy nhất để phát triển đa kiến ​​trúc, bạn cũng có thể sử dụng DirectCompute, nhưng tôi sẽ không nói đó là tùy chọn tốt nhất, chỉ khi bạn muốn mã của bạn chạy trên mọi GPU tương thích DirectX11, bao gồm một số chip đồ họa intel đúng không?

Nhưng ngay cả khi bạn đang nghĩ đến việc thực hiện một số chương trình GPU với OpenCL, đừng quên nghiên cứu kiến ​​trúc của nền tảng bạn đang sử dụng. CPU ATI, GPU và GPU NVIDIA có sự khác biệt lớn và mã của bạn là cần thiết để được điều chỉnh cho mỗi nền tảng mà bạn đang sử dụng nếu bạn muốn tận dụng tối đa ...

May mắn thay cả NVIDIA và AMD có trình Hướng dẫn để giúp bạn :)

1

Ngoài câu trả lời trước, cho CUDA bạn sẽ cần một thẻ NVIDIA/GPU, trừ khi bạn có quyền truy cập cho một từ xa, mà tôi sẽ ngôn ngữ

Heterogeneous Parallel Programming

Nó không chỉ cung cấp cho một giới thiệu về CUDA và OpenCL, mô hình bộ nhớ, ốp lát, xử lý điều kiện biên và cân nhắc hiệu suất, nhưng cũng chỉ thị dựa trên như OpenACC, mức cao: giới thiệu khóa học này từ Coursera ngôn ngữ cấp để thể hiện sự song song trong mã, để lại phần lớn công việc lập trình song song cho trình biên dịch (tốt để bắt đầu bằng). Ngoài ra, khóa học này có một nền tảng trực tuyến, nơi bạn có thể sử dụng GPU của họ, đó là tốt để bắt đầu lập trình GPU mà không cần liên quan đến thiết lập phần mềm/phần cứng.

0

Nếu bạn muốn viết mã di động mà bạn có thể thực thi trên các thiết bị GPU khác nhau và cũng trên CPU. Bạn cần sử dụng OpenCL.

Thực ra, để định cấu hình hạt nhân, bạn cần phải viết mã máy chủ trong C. Tệp cấu hình có thể ngắn hơn nếu bạn muốn viết cho hạt CUDA so với OpenCL.

Các vấn đề liên quan