Có một mảng lớn (~ 100 000) là biến động điểm và có ngưỡng (cũng là nổi điểm).So sánh điểm trôi nổi hiệu quả (Cortex-A8)
Vấn đề là tôi phải so sánh từng biến từ mảng với một ngưỡng, nhưng cờ NEON chuyển mất một thời gian thực sự dài (~ 20 chu kỳ phù hợp với một hồ sơ).
Có cách nào hiệu quả để so sánh các giá trị này không?
LƯU Ý: lỗi Như tròn không quan trọng, tôi đã cố gắng như sau:
float arr[10000];
float threshold;
....
int a = arr[20]; // e.g.
int t = threshold;
if (t > a) {....}
Nhưng trong trường hợp này tôi nhận được chuỗi lệnh xử lý như sau:
vldr.32 s0, [r0]
vcvt.s32.f32 s0, s0
vmov r0, s0 <--- takes 20 cycles as `vmrs APSR_nzcv, fpscr` in case of
cmp r0, r1 floating point comparison
Như chuyển đổi xảy ra tại NEON, không có vấn đề gì nếu tôi so sánh các số nguyên, theo cách được mô tả hoặc nổi.
Những người ở tại codereview.stackexchange.com cũng có thể phải nói điều gì đó với điều này. – PlasmaHH
Mã của bạn không phù hợp với tuyên bố vấn đề của bạn - dữ liệu là nổi nhưng bạn hiển thị ngưỡng dưới dạng int - bạn cũng truyền mỗi giá trị dữ liệu float tới int - tại sao? Nếu dữ liệu của bạn trôi nổi thì ngưỡng phải trôi nổi và bạn nên thực hiện so sánh nổi (nghĩa là không có chuyển đổi int-float). Ngoài ra, bạn dự định làm gì với các giá trị lớn hơn (hoặc nhỏ hơn) ngưỡng (điều này sẽ xác định xem NEON có phù hợp hay không)? –
Nhiều người bỏ NEON vì chậm hơn ARM mà không biết phải tránh những gì và cách lập trình SIMD đúng cách. Tùy thuộc vào những gì bạn chính xác muốn, nó hoặc là không SIMD khả thi để bắt đầu với, hoặc bạn không biết làm thế nào để xử lý nếu-else với NEON. –