2012-03-12 21 views
7

Trong C++ AMP, các hàm hạt nhân hoặc lambdas được đánh dấu bằng giới hạn (amp), áp đặt các hạn chế nghiêm trọng đối với tập hợp con được phép của C++ (listed here). CUDA có cho phép tự do hơn trên tập hợp con của C hoặc C++ trong các hàm hạt nhân không?Giới hạn (amp) có hạn chế hơn mã hạt nhân CUDA không?

+1

Có thể liên quan đến câu hỏi sau. http://stackoverflow.com/questions/4899425/what-are-the-real-c-language-constructs-supported-by-cuda-device-code –

+0

Câu hỏi hay, mặc dù tôi sợ nó không thực sự so sánh được (có lẽ di chuyển đến programmers.SE?): nvcc không hỗ trợ C++ 11 ở tất cả được nêu ra, vì vậy khi nói về lambdas bạn rõ ràng là không nhận được rất xa đó! Mặt khác, AMP có những hạn chế hoàn toàn khác nhau, bắt đầu với việc đó là microsoft; (hoặc, có lẽ chính xác hơn, sự thiếu hiện tại của triển khai không phải DirectX) làm cho nó hoàn toàn không thể sử dụng được cho nhiều ví dụ. ứng dụng khoa học. Nhưng tôi cho rằng bạn chỉ có nghĩa là hạn chế _language_? – leftaroundabout

+0

@leftaroundabout: Có, tôi chỉ nói về các hạn chế _language_, và tôi ổn khi ở trong C++ 03. Tôi đã đề cập đến lambdas chỉ vì nó là cơ chế quy định để khởi chạy mã hạt nhân với C++ AMP. – Eugene

Trả lời

18

Do các chức năng Visual Studio 11 và CUDA 4.1, restrict(amp) có nhiều hạn chế hơn các hàm tương tự của CUDA __device__. Đáng chú ý nhất, AMP là hạn chế hơn về cách con trỏ có thể được sử dụng. Đây là hậu quả tự nhiên của chất nền tính toán DirectX11 của AMP, không cho phép con trỏ trong mã số HLSL (trình đổ bóng đồ họa). Theo constrast, IR mức thấp của CUDA là PTX, mục đích chung hơn HLSL.

Dưới đây là một dòng bằng cách so sánh dòng:

| VS 11 AMP restrict(amp) functions  | CUDA 4.1 sm_2x __device__ functions | 
|------------------------------------------------------------------------------| 
|* can only call functions that have |* can only call functions that have | 
| the restrict(amp) clause    | the __device__ decoration   | 
|* The function must be inlinable  |* need not be inlined     | 
|* The function can declare only  |* Class types are allowed    | 
| POD variables      |          | 
|* Lambda functions cannot    |* Lambdas are not supported, but  | 
| capture by reference and    | user functors can hold pointers  | 
| cannot capture pointers    |          | 
|* References and single-indirection |* References and multiple-indirection | 
| pointers are supported only as  | pointers are supported    | 
| local variables and function   |          | 
|* No recursion       |* Recursion OK      | 
|* No volatile variables    |* Volatile variables OK    | 
|* No virtual functions     |* Virtual functions OK    | 
|* No pointers to functions    |* Pointers to functions OK   | 
|* No pointers to member functions  |* Pointers to member functions OK  | 
|* No pointers in structures   |* Pointers in structures OK   | 
|* No pointers to pointers    |* Pointers to pointers OK    | 
|* No goto statements     |* goto statements OK     | 
|* No labeled statements    |* Labeled statements OK    | 
|* No try, catch, or throw statements |* No try, catch, or throw statements | 
|* No global variables     |* Global __device__ variables OK  | 
|* Static variables through tile_static |* Static variables through __shared__ | 
|* No dynamic_cast      |* No dynamic_cast      | 
|* No typeid operator     |* No typeid operator     | 
|* No asm declarations     |* asm declarations (inline PTX) OK | 
|* No varargs       |* No varargs       | 

Bạn có thể đọc thêm về giới hạn restrict(amp) 's here. Bạn có thể đọc về hỗ trợ C++ trong các hàm CUDA __device__ trong Phụ lục D của CUDA C Programming Guide.

+0

IIRC có một cuộc thảo luận ở đây về các tính năng mà C++ AMP có thể đã bật nhưng không, đôi khi dựa trên các lựa chọn rõ ràng để khuyến khích thực hành tốt trong tính toán song song: http://channel9.msdn.com/Shows/Going+Deep/C- AMP-The-Phát triển-Team-Kỹ thuật-Roundtable –

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