2012-07-02 17 views
7

Tôi là người mới bắt đầu trong lập trình song song. Tôi có một truy vấn mà có thể có vẻ là ngớ ngẩn nhưng tôi đã không nhận được một câu trả lời dứt khoát khi tôi googled nó ra.GPU đọc từ CPU hoặc CPU ghi vào GPU?

Trong tính toán GPU, có một thiết bị tức là GPU và máy chủ, tức là CPU. Tôi đã viết một chương trình hello world đơn giản sẽ phân bổ một số bộ nhớ trên gpu, truyền hai tham số (nói src [] và dest []) cho kernel, sao chép chuỗi src tức là Hello world to dest string và lấy chuỗi dest từ gpu đến máy chủ.

Chuỗi có phải là "src" được đọc bởi GPU hoặc CPU ghi vào GPU không? Ngoài ra khi chúng tôi lấy lại chuỗi từ GPU, GPU có viết được bằng CPU hay CPU đọc từ GPU không?

Trong chuyển dữ liệu qua lại có thể có bốn khả năng 1. CPU GPU - CPU ghi vào GPU - GPU đọc dạng CPU 2. GPU để CPU - GPU ghi vào CPU - CPU đọc từ GPU

Ai đó có thể giải thích điều nào trong số này là có thể và không?

Trả lời

7

Trong các phiên bản trước của CUDA và các kiểu phần cứng tương ứng, GPU là bộ xử lý chính xác hơn thuộc sở hữu của CPU; CPU đã viết thông tin cho GPU và đọc lại thông tin khi GPU đã sẵn sàng. Ở cấp độ thấp hơn, điều này có nghĩa là tất cả bốn điều đã xảy ra: CPU đã ghi dữ liệu vào PCIe, GPU đọc dữ liệu từ PCIe, sau đó GPU ghi dữ liệu vào PCIe và CPU đọc lại kết quả. Nhưng các giao dịch được khởi xướng bởi CPU.

Gần đây hơn (CUDA 3? 4? Có thể bắt đầu bằng 2?), Một số chi tiết này bị ẩn khỏi cấp ứng dụng, do đó, hiệu quả, mã GPU có thể khiến quá trình chuyển được thực hiện theo cách tương tự như CPU có thể. Hãy xem xét địa chỉ ảo hợp nhất, theo đó các lập trình viên có thể truy cập vào một không gian địa chỉ ảo hợp nhất cho bộ nhớ CPU và GPU. Khi GPU yêu cầu bộ nhớ trong không gian CPU, điều này phải bắt đầu chuyển từ CPU, về cơ bản là đọc từ CPU. Khả năng đưa dữ liệu lên GPU từ phía CPU cũng được giữ lại. Về cơ bản, tất cả các cách có thể bây giờ, ở cấp cao nhất (ở mức thấp, nó chủ yếu là cùng một loại giao thức như mọi khi: cả đọc và ghi vào bus PCIe, nhưng bây giờ, GPU cũng có thể bắt đầu giao dịch).

+1

nào, thông qua bộ điều khiển đồng bộ khác nhau nắm để DMA (http://en.wikipedia.org/wiki/Direct_memory_access). – Ani

+0

Cảm ơn rất nhiều. Thật tuyệt khi biết rằng GPU cũng có thể khởi tạo các giao dịch. Vì vậy, có cách nào để biết ai thực sự bắt đầu các giao dịch bằng cách sử dụng bất kỳ thói quen thư viện trong Opencl? hoặc các thói quen sử dụng mà tôi có thể ép buộc CPU hoặc GPU để thực hiện giao dịch ..? – Nike

+0

Tôi không biết OpenCL cũng như tôi nên; đó đang được nói, tôi sẽ ngạc nhiên nếu CUDA không cung cấp cho bạn một số * * cách để kiểm tra nơi một biến sống trong không gian địa chỉ ảo thống nhất. Loại thông tin đó có thể hữu ích, ngay cả bên ngoài trường hợp sử dụng các giao dịch được quản lý rõ ràng (các phiên bản mới hơn sẽ vẫn hỗ trợ). – Patrick87

1

Trong OpenCL Host (CPU) là độc quyền kiểm soát tất cả các chuyển dữ liệu giữa GPU và GPU. Máy chủ chuyển dữ liệu đến GPU bằng bộ đệm. Chuyển máy chủ (đọc) trở lại từ GPU bằng bộ đệm. Đối với một số hệ thống và thiết bị, quá trình truyền không phải là việc sao chép byte khi Máy chủ và GPU sử dụng cùng một bộ nhớ vật lý. Điều này được gọi là zero copy.

2

Thực ra không có cái nào trong số này. Mã CPU bắt đầu bản sao dữ liệu, nhưng trong khi dữ liệu được bộ điều khiển bộ nhớ chuyển vào bộ nhớ của GPU thông qua bất kỳ xe buýt nào bạn có trên hệ thống. Trong khi đó, CPU có thể xử lý dữ liệu khác. Tương tự, khi GPU đã chạy xong hạt nhân bạn khởi chạy, mã CPU của bạn khởi tạo bản sao dữ liệu, nhưng trong khi đó cả GPU và CPU đều có thể xử lý dữ liệu khác hoặc chạy mã khác.

Các bản sao được gọi là không đồng bộ hoặc không bị chặn. Bạn có thể tùy chọn chặn các bản sao, trong đó CPU chờ bản sao được hoàn thành.

Khi khởi chạy tác vụ không đồng bộ, bạn thường đăng ký "sự kiện", đó là một số loại cờ mà bạn có thể kiểm tra sau này, để xem tác vụ có hoàn thành hay không.

1

Tôi vừa phát hiện ra trong diễn đàn này http://devgurus.amd.com/thread/129897 rằng việc sử dụng CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR trong clCreateBuffer cấp phát bộ nhớ trên máy chủ và rằng nó sẽ không được sao chép trên thiết bị.

Có thể có vấn đề với hiệu suất nhưng đây là những gì tôi đang tìm kiếm. Nhận xét của bạn xin vui lòng ..