Creo que no hay mucho que hacer que haga una gran diferencia. Tal vez puedas acelerarlo un poco con OpenMP o SSE. Pero las CPU modernas ya son bastante rápidas. En algunas aplicaciones, el ancho de banda/latencia de la memoria es en realidad el cuello de botella y empeora. Ya tenemos tres niveles de caché y necesitamos algoritmos inteligentes de captación previa para evitar grandes retrasos. Por lo tanto, tiene sentido pensar en los patrones de acceso a la memoria también.Por ejemplo, si se implementa como un multiply
y un add
y utilizar de esta manera:
void multiply(float vec[], float factor, int size)
{
for (int i=0; i<size; ++i)
vec[i] *= factor;
}
void add(float vec[], float summand, int size)
{
for (int i=0; i<size; ++i)
vec[i] += summand;
}
void foo(float vec[], int size)
{
multiply(vec,2.f,size);
add(vec,9.f,size);
}
que está básicamente pasar dos veces por encima del bloque de memoria. Dependiendo del tamaño del vector, podría no encajar en la memoria caché L1, en cuyo caso pasar dos veces agrega algo de tiempo extra. Esto obviamente es malo y deberías tratar de mantener los accesos a la memoria "local". En este caso, un solo bucle
void foo(float vec[], int size)
{
for (int i=0; i<size; ++i) {
vec[i] = vec[i]*2+9;
}
}
es probable que sea más rápido. Como regla general: Intente acceder a la memoria de forma lineal e intente acceder a la memoria "localmente", es decir, intente reutilizar los datos que ya están en la caché L1. Solo una idea.
Parece que ya sabes la respuesta. ¿Estás atrapado de alguna manera, o esperas que alguien más escriba el código para ti? –
¡Esto no es Rent-a-Coder! – Skizz
¿Qué tamaño de matriz se espera que sea (> 1,> 10,> 100,> 1000,> 10000)? ¿Considera usar optimización de múltiples núcleos (hilos) en su caso? ¿Hay alguna restricción conocida sobre la matriz por adelantado, otra es que el conteo es múltiplo de 4? – Suma