2012-03-26 23 views
12

Gömülü mimarimizde, 64-bit IAB (Talimat Hizalama Tamponu) var. Getirme sırasını optimize etmek için, bir ilmiğin gövdesinin bir 8 bayt sınırına hizalanmaya başlaması gerekir.C döngü için vücut C ile nasıl hizalanır?

Bunu, .balign yönergesini kullanarak derlemede gerçekleştirmek kolaydır, ancak C derleyicisinin kodu hizalaması için ipucu verecek bir sözdizimi bulamıyorum.

.balign yönergesiyle satır içi derlemeyle for döngüsünden önce gelmeye çalışmak, döngü döngüsünün kendisinin değil, döngü prologunu (kurulum) hizaladığından çalışmaz.

Döngünün içinde asm() satırının olduğu yerde aynı işlemi yapmak, döngü döngüsüne nop-s ekleyen döngü gövdesine ekler.

DÜZENLEME 1: İlk c=a+b bir 8 bayt adresine uyumlu hale getirilmesi istediğiniz

__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]; 
    } 

: kodunu varsayalım. Ön derlemeden sonra yukarıdaki gibi nop -s ekleyebilirim, ancak bu 1. kod değişikliği ile kırılacak bir geçici çözümdür.

DÜZEN 2: @R .. sayesinde, çözüm -falign-loops=8 derleyici seçeneğini kullanmaktır.

+0

Yani özünde, döngü * gövdesinin * hizalanmasına neden olacak nop-s'leri istiyorsun, ama bu nop'lerin döngüden önce çıkmasını istiyorsun * prolog *? – ruakh

+0

@ruakh - evet, döngü bitimindeki döngü yönergesi hizalanmış bir bellek konumuna işaret ettiği sürece, nop'lerin prologda kendiliğinden oluşturulup oluşturulmadığı umurumda değil. – ysap

+0

Anlaşıldı. Bu harika bir soru! – ruakh

cevap

3

Umm, GCC'nin -falign-loops seçeneği bu değil midir?

+0

Evet, ama sadece tek bir döngüyü etkilemek istiyorsanız. GCC'nin herhangi bir çözümü var mı? –

+1

Tek bir işlev için, #pragma GCC optimize özelliğini veya eşdeğer özniteliklerini kullanabilirsiniz. Yine de tek döngü seviyesinde yapabilirsen bilmiyorum. Başka bir yol olmazsa, bu döngüyü iç içe geçmiş bir işleve ve özniteliği iç içe işlevine ekleyerek ... ... korkunç bir hack ile başarabilirdiniz. –

+0

Hedeflenen tek işlevli en iyi duruma getirme, bazı durumlarda (sıcak döngüler) ve diğerlerinde kötü (nadir döngüler) iyi olabileceğinden, proje genelindeki seçeneklerden hala daha iyidir. Ne yazık ki, #pragma GCC optimize "align-loops = xx" 'nor' __attribute __ ((en iyileştirme ("align-loops = xx"))) 'testlerimde herhangi bir etki üretiyor gibi görünüyor (md5sum ile aynı) oluşturulan ikili dosyalar). – Cyan