Hãy xem ở đây tại phần vòng lặp - http://en.wikipedia.org/wiki/ARM_architecture
Về cơ bản bạn sẽ muốn một cái gì đó như:
void brighten(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
"\t mov r3, #0\n"
"Lloop:\n"
"\t cmp r3, %2\n"
"\t bge Lend\n"
"\t ldrb r4, [%0, r3]\n"
"\t add r4, r4, %3\n"
"\t strb r4, [%1, r3]\n"
"\t add r3, r3, #1\n"
"\t b Lloop\n"
"Lend:\n"
: "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
: "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
: "cc", "r3", "r4");
}
Cập nhật:
An d đây là phiên bản Neon:
void brighten_neon(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
"\t mov r4, #0\n"
"\t vdup.8 d1, %3\n"
"Lloop2:\n"
"\t cmp r4, %2\n"
"\t bge Lend2\n"
"\t vld1.8 d0, [%0]!\n"
"\t vqadd.s8 d0, d0, d1\n"
"\t vst1.8 d0, [%1]!\n"
"\t add r4, r4, #8\n"
"\t b Lloop2\n"
"Lend2:\n"
: "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
: "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
: "cc", "r4", "d1", "d0");
}
Vì vậy, phiên bản NEON này sẽ làm 8 tại một thời điểm. Tuy nhiên nó không kiểm tra rằng numPixels
là chia hết cho 8 vì vậy bạn chắc chắn muốn làm điều đó nếu không mọi thứ sẽ đi sai! Dù sao, nó chỉ là một khởi đầu cho bạn thấy những gì có thể được thực hiện. Lưu ý cùng một số hướng dẫn, nhưng hành động trên tám pixel dữ liệu cùng một lúc. Oh và nó có độ bão hòa trong đó cũng như tôi giả sử bạn sẽ muốn.
Các chức năng như thế này cũng có thể được triển khai bằng cách sử dụng OpenGL ES và trình đổ bóng phân đoạn. Nếu điều này có thể áp dụng cho vấn đề của bạn. Điều đó sẽ cung cấp cho bạn song song "miễn phí", tương tự như việc sử dụng NEON như Matt đề xuất. – Arne
Bạn chắc chắn có thể sử dụng OpenGL ES cho chắc chắn. Phụ thuộc rất nhiều vào những gì bạn đang làm và nếu bạn muốn kéo nó như một sự phụ thuộc. – mattjgalloway
OpenGL ES có thể không đủ nhanh nếu anh ta cần lấy lại tổng số tính toán cho CPU. GPU của iPad không được sản xuất để thực hiện tác vụ này một cách hiệu quả. – Etan