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
.
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
@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
Đã hiểu. Đây là một câu hỏi hay! – ruakh