Altivec
Altivec és el conjunt d'instruccions SIMD (en anglès, Single Instruction Multiple Data) propietat de l'aliança AIM (Apple Computer, IBM i Motorola). Aquestes conjunt d'instruccions treballen tant amb nombres enters com amb nombres en coma flotant i hi són implementades en diferents versions de processadors PowerPC (com el G4 de Motorola o el G5 d'IBM). Altivec és una marca registrada propietat de Motorola, per la qual cosa aquest sistema també es coneix com a Velocity Engine (per Apple Computer) i VMX (per IBM).
Malgrat que l'especificació d'Altivec es refereix a un únic conjunt d'instruccions, les implementacions que IBM i Motorola han fet d'ell són diferents quant a lògica de disseny i cap de les dues companyies ha utilitzat mai la implementació de l'altra.
Altivec va ser el sistem SIMD més potent integrat en un microprocessador quan es va introduir a finals de la dècada dels 90. Si el comparem amb altres extensions similars d'aquest període (com és el cas de MMX/SSE de Intel o 3DNow! de AMD), Altivec oferia més registres, més operacions i era més flexible que els seus competidors. Va ser amb l'aparició de SSE2 (propietat de Intel) quan Altivec va poder comparar-se amb un altre sistema de prestacions similars. Els dos treballen amb registres vectorials de 128 bits i poden representar setze enters de 8 bits, vuit enters de 16 bits, quatre enters de 32 bits o 4 valors en punt flotant de 32 bits. Els dos sistemes també inclouen instruccions de control de la memòria cau per tal de reduir al maxim la contaminació d'aquest tipus de memoria quan es treballa amb aquest flux de dades.
Altivec i SSE2 també mostren diferències importants. Al contrari que SS2, Altivec suporta un tipus de dades especial anomenat pixel RGB, pero no pot operar amb valors de coma flotant de doble precisió, i no proporciona cap mecanisme per moure dades directament entre els registres escalars i els registres vectorials. També hi ha diferències quant al nombre de registres vectorials. Altivec proporciona 32 registres de 128 bits, mentres que SS2 només en proporciona 8.
Exemple d'utilització
[modifica]La utilització d'Altivec en un programa escrit en C és relativament fàcil. Considerem, per exemple, una funció C que calcula les diferències de dos imatges amb dimensions NxN. El codi resta els valors de cadascun dels pixels que formen les imatges i, en funció del valor resultant, genera una nova imatge en blanc i negre.
unsigned char I1[N*N], I2[N*N], R[N*N]; for(size_t i = 0; i < N*N; i++) { signed short s = I2[i] - I1[i]; R[i] = (s<10 || s>240) ? 0 : 255; }
El codi C Altivec seria el següent:
unsigned char I1[N*N], I2[N*N], R[N*N]; vector unsigned char vS,vR,v240,v10,V0,V255; vector bool char vC; v0 = vec_splat_u8(0); v10 = vec_splat_u8(10); v240 = (vector unsigned char)vec_splat_s8(-15); v255 = (vector unsigned char)vec_splat_s8(-1); for(size_t i = 0; i < (N*N)/16; i++) { vS = vec_sub(vec_ld(I2,16*i), vec_ld(I1,16*i)); vC = vec_or(vec_cmplt(vS, v10), vec_cmpgt(vS, v240)); vR = vec_sel(v255, v0, vC); vec_st(vR, R, i*16); }