Im khá mới để lắp ráp và mặc dù trung tâm thông tin cánh tay thường hữu ích đôi khi các hướng dẫn có thể gây nhầm lẫn với người mới. Về cơ bản những gì tôi cần làm là tổng hợp 4 giá trị float trong một đăng ký quadword và lưu trữ kết quả trong một thanh ghi chính xác duy nhất. Tôi nghĩ rằng lệnh VPADD có thể làm những gì tôi cần nhưng tôi không chắc lắm.Tổng hợp tất cả các phần tử trong vectơ quadword trong cụm ARM với NEON
Trả lời
Dường như bạn muốn lấy tổng của một độ dài nhất định của mảng và không chỉ có bốn giá trị float.
Trong trường hợp đó, mã của bạn sẽ làm việc, nhưng còn xa mới được tối ưu hóa:
nhiều nhiều interlocks đường ống
không cần thiết Ngoài 32bit mỗi lần lặp
Giả sử chiều dài của mảng là bội số của 8 và ít nhất là 16:
vldmia {q0-q1}, [pSrc]!
sub count, count, #8
loop:
pld [pSrc, #32]
vldmia {q3-q4}, [pSrc]!
subs count, count, #8
vadd.f32 q0, q0, q3
vadd.f32 q1, q1, q4
bgt loop
vadd.f32 q0, q0, q1
vpadd.f32 d0, d0, d1
vadd.f32 s0, s0, s1
- pld - trong khi là hướng dẫn ARM chứ không phải NEON - rất quan trọng cho hiệu suất. Nó làm tăng đáng kể tốc độ truy cập bộ nhớ cache.
Tôi hy vọng phần còn lại của mã ở trên là tự giải thích.
Bạn sẽ nhận thấy rằng phiên bản này nhanh hơn nhiều lần so với phiên bản ban đầu của bạn.
Bạn có thể thử này (nó không có trong ASM, nhưng bạn sẽ có thể chuyển đổi nó một cách dễ dàng):
float32x2_t r = vadd_f32(vget_high_f32(m_type), vget_low_f32(m_type));
return vget_lane_f32(vpadd_f32(r, r), 0);
Trong ASM nó sẽ là lẽ chỉ VADD và VPADD.
Tôi không chắc chắn nếu điều này là phương pháp duy nhất để làm điều này (và tối ưu nhất), nhưng tôi đã không tìm/tìm thấy tốt hơn một ...
PS. Tôi mới đến neon quá
Đây là mã trong ASM:
vpadd.f32 d1,d6,d7 @ q3 is register that needs all of its contents summed
vadd.f32 s1,s2,s3 @ now we add the contents of d1 together (the sum)
vadd.f32 s0,s0,s1 @ sum += s1;
Tôi có thể đã quên đề cập đến trong C mã sẽ trông như thế này:
float sum = 1.0f;
sum += number1 * number2;
Tôi có bỏ qua phép nhân từ mã asm nhỏ này.
cảm ơn tôi đã làm việc này bằng cách sử dụng một VPADD và hai VADD của tôi đã hy vọng sẽ phải chỉ sử dụng 1 hoặc 2 hướng dẫn nhưng tôi nghĩ rằng 3 sẽ chỉ phải làm. –
Bạn có thể hiển thị ASM của mình không? Tôi nghĩ rằng nó sẽ chỉ yêu cầu một VADD và một VPADD (ít nhất là nó trông từ mã C) – kibab