Có một câu hỏi đơn giản cơ bản ở đây, không liên quan đến Repa, cộng với một số câu hỏi cụ thể về Repa.Hiệu năng Repa 3 và sử dụng chính xác 'now'
Tôi đang làm việc trên thư viện bằng Repa3. Tôi gặp sự cố khi nhận mã song song hiệu quả. Nếu tôi thực hiện các chức năng của mình trả về các mảng bị trì hoãn, tôi nhận được mã chậm quá mức có thể lên tới 8 lõi. Mã này chiếm hơn 20GB bộ nhớ cho mỗi trình lược tả GHC, và chạy một số đơn đặt hàng có cường độ chậm hơn so với các vectơ không có hộp Haskell cơ bản. Ngoài ra, nếu tôi thực hiện tất cả các chức năng của mình trả về các bảng kê khai không được hộp (vẫn cố gắng sử dụng sự kết hợp trong các hàm, ví dụ khi tôi thực hiện 'bản đồ'), tôi nhận được mã MUCH nhanh hơn (vẫn chậm hơn sử dụng Haskell unboxed). vectơ) không quy mô chút nào và trên thực tế có xu hướng chậm hơn một chút với nhiều lõi hơn.
Dựa trên mã ví dụ FFT trong thuật toán Repa, có vẻ như cách tiếp cận đúng là luôn trả về các mảng biểu hiện. Có bao giờ một trường hợp tôi phải trả lại mảng bị trễ không?
Mã FFT cũng sử dụng nhiều chức năng 'hiện hành'. Tuy nhiên, tôi gặp phải lỗi loại khi tôi cố gắng sử dụng nó trong mã của mình:
type Arr t r = Array t DIM1 r
data CycRingRepa m r = CRTBasis (Arr U r)
| PowBasis (Arr U r)
fromArray :: forall m r t. (BaseRing m r, Unbox r, Repr t r) => Arr t r -> CycRingRepa m r
fromArray =
let mval = reflectNum (Proxy::Proxy m)
in \x ->
let sh:.n = extent x
in assert (mval == 2*n) PowBasis $ now $ computeUnboxedP $ bitrev x
Mã biên dịch không có 'bây giờ'. Với sự 'bây giờ', tôi nhận được lỗi sau:
Couldn't match type
r' with
Array U (Z :. Int) r' `r' is a rigid type variable bound by the type signature for fromArray :: (BaseRing m r, Unbox r, Repr t r) => Arr t r -> CycRingRepa m r at C:\Users\crockeea\Documents\Code\LatticeLib\CycRingRepa.hs:50:1 Expected type: CycRingRepa m r Actual type: CycRingRepa m (Array U DIM1 r)
tôi không nghĩthis là vấn đề của tôi. Sẽ rất hữu ích nếu ai đó có thể giải thích cách Monad hoạt động trong 'bây giờ'. Theo ước tính tốt nhất của tôi, monad dường như đang tạo ra một 'Arr U (Arr U r)'. Tôi đang mong đợi một 'Arr U r', mà sau đó sẽ phù hợp với mô hình xây dựng dữ liệu. Điều gì đang xảy ra và làm cách nào để khắc phục sự cố này?
Chữ ký loại là:
computeUnboxedP :: Fill r1 U sh e => Array r1 sh e -> Array U sh e
now :: (Shape sh, Repr r e, Monad m) => Array r sh e -> m (Array r sh e)
Nó sẽ rất hữu ích để có một ý tưởng tốt hơn khi nó là thích hợp để sử dụng 'doanh nghiệp'.
Một vài câu hỏi khác về Repa: Tôi có nên gọi hàm computeUnboxedP (như trong mã ví dụ FFT) hay tôi nên sử dụng tính toán tổng quát hơn (vì phần unbox được suy ra theo kiểu dữ liệu của tôi)? Tôi có nên lưu trữ các mảng bị trễ hoặc biểu hiện trong kiểu dữ liệu CycRingRepa không? Cuối cùng tôi cũng muốn mã này hoạt động với các số nguyên Haskell. Điều này đòi hỏi tôi phải viết mã mới sử dụng một cái gì đó khác hơn là mảng U, hoặc tôi có thể viết mã đa hình tạo ra các mảng U cho các loại unbox và một số mảng khác cho các kiểu Integers/boxed?
Tôi nhận thấy có rất nhiều câu hỏi ở đây và tôi đánh giá cao bất kỳ/tất cả câu trả lời!