Ich denke, es gibt nicht viel, was Sie tun können, macht einen großen Unterschied. Vielleicht können Sie es mit OpenMP oder SSE etwas beschleunigen. Aber moderne CPUs sind schon ziemlich schnell. In einigen Anwendungen ist Speicherbandbreite/Latenz tatsächlich der Flaschenhals und es wird schlechter. Wir haben bereits drei Cache-Ebenen und benötigen intelligente Prefetch-Algorithmen, um große Verzögerungen zu vermeiden. Es macht also Sinn, auch über Speicherzugriffsmuster nachzudenken.Zum Beispiel, wenn Sie bei der Implementierung eines solchen multiply
und eine add
und es wie folgt verwendet werden:
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);
}
Sie grundsätzlich zweimal über den Speicherblock vorbei. Abhängig von der Größe des Vektors passt er möglicherweise nicht in den L1-Cache. In diesem Fall wird bei einer zweimaligen Übergabe zusätzliche Zeit benötigt. Dies ist offensichtlich schlecht und Sie sollten versuchen, Speicherzugriffe "lokal" zu halten. In diesem Fall wird eine einzelne Schleife wahrscheinlich schneller sein. Als Faustregel gilt: Versuchen Sie, linear auf den Speicher zuzugreifen, und versuchen Sie, "lokal" auf den Speicher zuzugreifen, indem Sie versuchen, die bereits im L1-Cache vorhandenen Daten wiederzuverwenden. Nur eine Idee.
Sie scheinen die Antwort bereits zu kennen. Bist du in irgendeiner Weise festgefahren oder erwartest du nur, dass jemand anderes den Code für dich schreibt? –
Dies ist kein Rent-a-Coder! – Skizz
Wie groß soll das Array sein (> 1,> 10,> 100,> 1000,> 10000)? Sie überlegen, in Ihrem Fall die Optimierung mehrerer Threads (Threads) zu verwenden? Sind Einschränkungen bezüglich des Arrays im Voraus bekannt, andere zählen dann als Vielfaches von 4? – Suma