02 Ekim 2010

Gcc ve vektör işlemleri

Bir çok modern işlemcinin multimedya işleri için sınırlı bir SIMD kapasitesi mevcut. MMX, SSE vs. isimleriyle bilinen bu ek komutların fonksiyonu özetle, tek bir komutu paralel olarak birden fazla değişkene uuygulamak. Örneğin aşağıdaki kod, 32-bitlik bir derleyiciyle aşağıdaki kodu derlerseniz, 4 adet int değişkeni, başka 4 adet int'e ekleyen bir program elde etmiş olursunuz.
#include<stdio.h>
union vint{
int __attribute__((vector_size(16))) v;
int b[4];
};
int main()
{
int arr[]={1,2,3,4,5,6,7,8};
int __attribute__((vector_size(16))) *a,*b;
union vint c;
a=arr;
b=arr+4;
c.v= *a + *b;
printf("%d %d %d %d\n",c.b[0],c.b[1],c.b[2],c.b[3] );
printf("size=%d",sizeof(c));
return 0;
}
view raw vektor.c hosted with ❤ by GitHub

Burada dikkat edilmesi gereken, vector_size parantezindeki sayı, vektördeki değişlen sayısını değil, vektörün bayt cinsinden toplam büyüklüğünü verir. Bu yüzden kodun doğru çalışması, üzerinde çalıştığınız donanıma bağlı.