Làm cách nào để kiểm soát các phép tính nào được thực hiện trên CPU và được thực hiện trên GPU?


14

Sự hiểu biết hiện tại của tôi là mọi thứ được thực hiện trong tệp shader đều được thực hiện trên GPU và mọi thứ được thực hiện trong mã (Java, trong trường hợp của tôi) đều được thực hiện trên CPU.

Đây có phải là một mô tả chính xác?


2
Ngoài ra, bạn có thể thực hiện tính toán trên GPU bằng cách sử dụng một cái gì đó như OpenCL , về cơ bản cho phép bạn chạy mã trên GPU.
Xà phòng

Câu trả lời:


20

Đó là ý chính của nó.

Về nguyên tắc, nền tảng có thể, có thể hình dung, làm bất cứ điều gì nó muốn. Người ta có thể tưởng tượng một hệ điều hành tiên tiến thực hiện dịch mã biên dịch kịp thời từ x86 sang mã GPU. Tương tự, trình điều khiển OpenGL có thể chạy bất cứ thứ gì nó muốn trên CPU chủ.

Nhưng thực sự, những gì bạn vừa mô tả, là những gì xảy ra.


5
IIRC, các shader được biên dịch trên CPU trước khi được gửi tới GPU. Và điều đó được thực hiện bởi trình điều khiển GPU mà không cần hệ điều hành.
MSalters

Thật. Tôi đã xử lý nhiều lỗi biên dịch trong khi chạy chương trình trong các shader, ngay cả khi mã java đã được biên dịch.
Bassinator

1
Về mặt lý thuyết: Giả sử tôi có một chương trình rất tốn CPU nhưng chỉ là giao diện dòng lệnh (không có công việc đồ họa). Tôi có thể giảm tải một số công việc cho GPU không? Tôi không thực sự có kế hoạch thực hiện điều này, Nó chỉ là một khái niệm mà tôi quan tâm.
Bassinator

2
Đúng! Liên kết mà @return true đã đăng là dành cho thư viện Java thực hiện điều đó. Tổng quát hơn, bạn có thể viết một "shader tính toán" trong OpenGL hoặc sử dụng OpenCL. Trong mọi trường hợp, bạn cần cách ly một phần mã của mình có thể song song và truyền thông tin vào và ra khỏi mã. (GPU chủ yếu là tuyệt vời cho các tác vụ "song song xấu hổ".)
david van brink

1
Một dấu hoa thị để thêm vào câu trả lời này là một số triển khai hỗ trợ cho ý tưởng về "preshader" - nghĩa là mã là một phần của trình đổ bóng, nhưng kết quả của nó sẽ không đổi trên tất cả các lệnh trong một lệnh gọi cho trước (như nhân rộng chế độ xem thống nhất & ma trận chiếu). Một trình biên dịch shader có khuynh hướng có thể xác định các bit mã như thế này và đưa chúng ra để được thực thi một khi phía CPU, bao gồm cả kết quả đầu ra không đổi trong công việc được gửi tới GPU. Đó là một trường hợp phổ biến trong đó giả định "shader = GPU" có thể bị bẻ cong, mặc dù chỉ chi tiết.
DMGregory

7

Nói chung, Có. Java được sử dụng để viết các chương trình chạy trên cpu. Các ngôn ngữ shader (cg, hlsl, et al) được sử dụng để viết các chương trình chạy trên gpu.

Một ngoại lệ cho quy tắc sẽ là sử dụng apis của bên thứ ba có thể thu hẹp khoảng cách.


1
Mẹo rất thú vị, liên kết của bạn đến "aparapi". Chạy một số mã JVM trên GPU ... hấp dẫn!
david van brink

3

david van brink đã trả lời câu hỏi của bạn nói chung.

Nhưng như ông nói, trình điều khiển OpenGL có thể chạy mọi thứ trên CPU và nó thực sự xảy ra rất nhiều. Đặc biệt với bối cảnh tương thích, trong đó một số chức năng kế thừa kỳ lạ không thể được thực hiện trên các card đồ họa. Họ yêu cầu mô phỏng phần mềm. Ví dụ, tôi đã nghe trước khi quy định được thực thi trên CPU. Bạn có thể mong đợi cũng bất ngờ với chọn.
Những bất ngờ này có thể xảy ra thậm chí nhiều hơn trên MacOS khi sử dụng bối cảnh 2.1, bởi vì Apple đã thống nhất quan điểm về OpenGL khá tốt trên phạm vi phần cứng của họ và một số phần cứng nhỏ hơn thiếu một số thứ phải được mô phỏng. Nó thực sự có thể thực hiện đầy đủ thông số kỹ thuật ENTIRE OpenGL 2.1 trên CPU, nếu mã tạo ngữ cảnh chỉ định rõ ràng một thiết bị phần mềm.

Ngược lại, mã được thực thi thông qua các thư viện điện toán như vexcl hoặc boost compute hoặc lực đẩy AMP hoặc nVidia của microsoft, CÓ THỂ được thực thi trên GPU hoặc CPU tùy thuộc vào cờ thiết lập API.

Và để hoàn thiện, bên trong CPU bạn cũng có kiến ​​trúc DSP với phần mà chúng ta gọi là SIMD. Trình biên dịch ispc của Intel cung cấp trợ giúp trong việc tạo mã được "đảm bảo" để chạy trên các làn SIMD với nhiều chẩn đoán hiệu suất tại thời điểm biên dịch để giúp bạn tận dụng tối đa mã đó. Thêm OpenMP vào đó và bạn có thể nhận được SIMD đa luồng, tiếp cận các khái niệm về GPU. Nếu bạn có CPU cao cấp và GPU cấp thấp, điều này thực sự có thể hiệu quả hơn.
http://ispc.github.io/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.