Heim > Backend-Entwicklung > C++ > Was sind die Alternativen zu std::vector in C OpenMP Parallel For-Schleifen?

Was sind die Alternativen zu std::vector in C OpenMP Parallel For-Schleifen?

Barbara Streisand
Freigeben: 2024-11-28 20:30:13
Original
302 Leute haben es durchsucht

What are the Alternatives to std::vector in C   OpenMP Parallel For Loops?

C OpenMP Parallel For Loop: Alternativen zu std::vector

std::vector ist eine vielseitige Datenstruktur, die häufig parallel für verwendet wird Schleifen mit OpenMP. Es gibt jedoch Situationen, in denen Alternativen möglicherweise besser geeignet sind, insbesondere wenn die Geschwindigkeit Priorität hat oder Probleme mit der Größenänderung während der Schleife auftreten.

Eine Option für eine gemeinsame Datenstruktur ist die Verwendung einer benutzerdefinierten Reduzierung mit OpenMP 4.0 's #pragma omp deklariert Reduzierung. Dies reduziert den Bedarf an kritischen Abschnitten und vereinfacht den parallelen Code.

Eine weitere Alternative zur Wahrung der Reihenfolge ist die Verwendung von statischer Planung mit geordneten Abschnitten. Dadurch wird sichergestellt, dass jeder Thread der Reihe nach in einen bestimmten Teil des Vektors schreibt, wodurch eine spätere Zusammenführung entfällt.

In Szenarien, in denen eine Größenänderung erforderlich ist, eine Methode, die Zeigerarrays zum Verfolgen von Threads verwendet -spezifische Präfixsummen können übernommen werden. Dieser Ansatz vermeidet den Aufwand für die Größenänderung auf dem kritischen Pfad.

Hier finden Sie Codebeispiele für diese Alternativen:

// Custom reduction
#pragma omp declare reduction (merge: std::vector<int>: omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end())

std::vector<int> vec;
#pragma omp parallel for reduction(merge: vec)
for (int i = 0; i < 100; i++) vec.push_back(i);
Nach dem Login kopieren
// Static scheduling with ordered sections
std::vector<int> vec;
#pragma omp parallel
{
    int ithread = omp_get_thread_num();
    int nthreads = omp_get_num_threads();
    #pragma omp single
    {
        prefix = new size_t[nthreads + 1];
        prefix[0] = 0;
    }
    std::vector<int> vec_private;
    #pragma omp for schedule(static) nowait
    for (int i = 0; i < 100; i++) {
        vec_private.push_back(i);
    }
    prefix[ithread + 1] = vec_private.size();
    #pragma omp barrier
    #pragma omp single
    {
        for (int i = 1; i < (nthreads + 1); i++)
            prefix[i] += prefix[i - 1];
        vec.resize(vec.size() + prefix[nthreads]);
    }
    std::copy(vec_private.begin(), vec_private.end(), vec.begin() + prefix[ithread]);
}
delete[] prefix;
Nach dem Login kopieren

Die Auswahl der geeigneten Alternative für Ihren speziellen Fall hängt von den Anforderungen ab und Leistungsüberlegungen. Experimente und Profilerstellung können dabei helfen, die optimalste Lösung zu ermitteln.

Das obige ist der detaillierte Inhalt vonWas sind die Alternativen zu std::vector in C OpenMP Parallel For-Schleifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage