Ich habe nicht viel Erfahrung mit openmp.OpenMP für Schleife und Zeiger
Ist es möglich, den folgenden Code schneller zu machen, indem Sie einen For-Schleife über Zeiger statt Index verwenden?
Gibt es trotzdem den folgenden Code schneller machen?
Der Code multipliziert ein Array mit einer Konstanten.
Vielen Dank.
Code:
#include <iostream>
#include <stdlib.h>
#include <stdint.h>
#include <vector>
using namespace std;
int main(void){
size_t dim0, dim1;
dim0 = 100;
dim1 = 200;
std::vector<float> vec;
vec.resize(dim0*dim1);
float scalar = 0.9;
size_t size_sq = dim0*dim1;
#pragma omp parallel
{
#pragma omp for
for(size_t i = 0; i < size_sq; ++i){
vec[i] *= scalar;
}
}
}
Serien Zeiger Schleife
float* ptr_start = vec.data();
float* ptr_end = ptr_start + dim0*dim1;
float* ptr_now;
for(ptr_now = ptr_start; ptr_now != ptr_end; ++ptr_now){
*(ptr_now) *= scalar;
}
In Ihrer Schleife sind nur 20.000 Werte vorhanden, und die CPU-Synchronisierung hat auch einen gewissen Mehraufwand. Haben Sie gemessen, wie schnell die Schleife mit und ohne OMP ist? Können Sie diese Ergebnisse teilen? –
die tatsächliche Anordnung ist viel größer als diese. Ich möchte auch wissen, ob ich etwas getan habe, was Leistung schadet, weil ich openmp auch an anderen Orten verwenden werde. – rxu
Wirklich generierter Code kann sich von dem unterscheiden, was Sie geschrieben haben. Haben Sie das Release-Programm mit allen Optimierungen disassembliert? PS .: Kann man mit OpenMP "size_t" als Indextyp verwenden? – ilotXXI