2013-07-23 44 views
6

Tôi đang chuyển một số mã mô phỏng vật lý từ C++ sang CUDA.Cách sử dụng đa hình trong CUDA

Thuật toán cơ bản có thể được hiểu là: áp dụng toán tử cho từng phần tử của vectơ. Trong giả, một mô phỏng có thể bao gồm các cuộc gọi hạt nhân sau:

apply(Operator o, Vector v){ 
    ... 
} 

Ví dụ:

apply(add_three_operator, some_vector) 

sẽ thêm ba cho mỗi phần tử trong vector.

Trong mã C++ của tôi, tôi có một toán tử lớp cơ sở trừu tượng, với nhiều triển khai cụ thể khác nhau. Phương pháp quan trọng là Toán tử lớp { hoạt động kép ảo (gấp đôi x) = 0; Soạn nhà điều hành (Nhà điều hành lo, Nhà điều hành ro); ... }

Việc thực hiện cho AddOperator có thể trông như thế này:

class AddOperator : public Operator{ 
    private: 
     double to_add; 
    public: 
     AddOperator(double to_add): to_add(to_add){} 
     double operator(double x){ 
      return x + to_add; 
     } 
}; 

Lớp điều hành có phương pháp để mở rộng quy mô và sáng tác triển khai cụ thể của điều hành. Sự trừu tượng này cho phép tôi đơn giản soạn các toán tử "leaf" thành các phép biến đổi chung hơn.

Ví dụ:

apply(compose(add_three_operator, square_operator), some_vector); 

sẽ thêm ba thì vuông mỗi phần tử của vector.

Vấn đề là CUDA không hỗ trợ các cuộc gọi phương thức ảo trong hạt nhân. Suy nghĩ hiện tại của tôi là sử dụng các mẫu. Sau đó, các cuộc gọi hạt nhân sẽ trông giống như sau:

apply<Composition<AddOperator,SquareOperator>> 
    (compose(add_three_operator, square_operator), some_vector); 

Bất kỳ đề xuất nào?

+6

Tôi tin rằng 'chức năng virtual' yêu cầu biên soạn với '-arch = sm_20' hoặc cao hơn. Tuy nhiên, tôi khuyên bạn nên cô lập tính đa hình của bạn với mã máy chủ khởi chạy hạt nhân. Thậm chí nếu bạn cuối cùng đã có những điều biên dịch tôi mong đợi hiệu suất của công văn chức năng ảo trong mã SIMD sẽ gây thất vọng. –

+5

Tôi đồng ý với Jared. Ngay cả trên CPU, nếu các hoạt động tương tự đang được áp dụng cho mọi phần tử của vectơ lớn, tôi sẽ xem xét tái cấu trúc sao cho đa hình ở mức cao hơn, và các cuộc gọi phương thức ảo không nằm trong vòng lặp bên trong của bạn. Một khi bạn làm điều đó, việc song song sẽ có hiệu suất cao hơn nhiều (trong CUDA, OpenMP, hoặc bất kỳ thứ gì). Bạn cũng có thể xem xét lực đẩy cho việc này. – harrism

+0

Cảm ơn bạn đã phản hồi. Tôi thực sự đã sử dụng Thrust. Tôi sẽ tiếp tục với các mẫu. – user2611717

Trả lời

1

Something như thế này có lẽ ...

template <class Op1, class Op2> 
class Composition {...} 

template <class Op1, class Op2> 
Composition<Op1, Op2> compose(Op1& op1, Op2& op2) {...} 

template<class C> 
void apply(C& c, VecType& vec){...} 
Các vấn đề liên quan