2012-03-26 25 views
12

Trong kiến ​​trúc nhúng của chúng tôi, chúng tôi có IAB 64 bit (Bộ đệm liên kết hướng dẫn). Để tối ưu hóa chuỗi tìm nạp, yêu cầu rằng phần thân của vòng lặp sẽ bắt đầu được căn chỉnh với ranh giới 8 byte.Làm thế nào để căn chỉnh C cho vòng lặp cơ thể w/GCC?

Thật dễ dàng để đạt được điều này trong lắp ráp bằng cách sử dụng chỉ thị .balign, nhưng tôi không thể tìm thấy cú pháp sẽ gợi ý trình biên dịch C căn chỉnh mã.

Cố gắng đi trước vòng lặp với lắp ráp nội tuyến với chỉ thị .balign không hoạt động vì nó căn chỉnh vòng lặp prolog (thiết lập) và không phải là thân vòng lặp.

Làm tương tự khi đường dây asm() nằm trong vòng lặp, thêm nop -s vào vòng lặp có chi phí chu kỳ quý giá.

EDIT 1: giả mã:

__asm__ volatile("nop"); 
    __asm__ volatile("nop"); 

    for (j0=0; j0<N; j0+=4) 
    { 
     c[j0+ 0] = a[j0+ 0] + b[j0+ 0]; 
     c[j0+ 1] = a[j0+ 1] + b[j0+ 1]; 
     c[j0+ 2] = a[j0+ 2] + b[j0+ 2]; 
     c[j0+ 3] = a[j0+ 3] + b[j0+ 3]; 
    } 

Tôi muốn c=a+b đầu tiên được liên kết đến một địa chỉ 8-byte. Tôi có thể thêm nop -s như trên sau khi biên dịch sơ bộ, nhưng đây là một giải pháp đặc biệt sẽ phá vỡ với thay đổi mã thứ nhất.

CHỈNH SỬA 2: Nhờ @R .., giải pháp là sử dụng tùy chọn trình biên dịch -falign-loops=8.

+0

Vì vậy, về bản chất, bạn muốn 'nop'-s sẽ làm cho vòng lặp * body * được căn chỉnh, nhưng bạn muốn những' nop'-s đi trước vòng lặp * prolog *? – ruakh

+0

@ruakh - vâng, mặc dù tôi không quan tâm nếu 'nop'-s được tạo trong chính prolog, miễn là lệnh rẽ nhánh ở cuối các điểm vòng lặp đến vị trí bộ nhớ phù hợp. – ysap

+0

Đã hiểu. Đây là một câu hỏi hay! – ruakh

Trả lời

3

Umm, đây có phải là tùy chọn của -falign-loops của GCC không?

+0

Có, nhưng nếu bạn muốn chỉ ảnh hưởng đến một vòng lặp duy nhất. GCC có giải pháp nào không? –

+1

Đối với một hàm duy nhất, bạn có thể sử dụng '#pragma GCC optimization' hoặc các thuộc tính tương đương. Tôi không biết nếu bạn có thể làm điều đó trên cấp độ vòng lặp duy nhất mặc dù. Nếu không có cách nào khác, bạn có thể đạt được điều này với một hack khủng khiếp bằng cách đặt vòng lặp trong một hàm lồng nhau và đặt thuộc tính vào hàm lồng nhau ...? –

+0

Nhắm mục tiêu tối ưu hóa chức năng duy nhất vẫn còn tốt hơn so với tùy chọn toàn dự án, vì nó có thể tốt trong một số trường hợp (vòng nóng) và xấu ở những người khác (vòng hiếm). Thật không may, không phải '#pragma GCC tối ưu hóa 'align-loops = xx" 'cũng không' __attribute __ ((tối ưu ("align-loops = xx"))) 'dường như tạo ra bất kỳ hiệu ứng nào trong các thử nghiệm của tôi (giống' md5sum' trên được tạo ra nhị phân). – Cyan

Các vấn đề liên quan