0

コマンドを使用してUbuntu 12.04でビルドします

g++ -pthread hello.cpp

しかし、並列モードを実行すると、常に通常より遅くなります。これが私のコードです

#include <iostream>
#include <pthread.h>
#include <math.h>

using namespace std;

#define NUM_THREADS 4   
#define MAX_NUMBER 10000000

void *doSomething(void *param)
{
    int id = (int) param;
    int sum = 0;
    for (int i = 0; i < MAX_NUMBER; i++)
    {
        sum += sin(i) + cos(i) + tan(i);      // sum
    }
    return NULL;
}

void runNormal()
{
            // run in normal mode with NUM_THREADS times.
    for (int i = 0; i < NUM_THREADS; i++)
    {
        doSomething((void *) i);
    }
}

void runParallel()
{
    pthread_t threads[NUM_THREADS];
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    int rc, i;
    for (i = 0; i < NUM_THREADS; i++)
    {
        rc = pthread_create(&threads[i], &attr, doSomething, (void *) i);
        if (rc)
        {
            cout << "ERROR : can't create thread #" << i;
        }
    }

    pthread_attr_destroy(&attr);
    void *status;
    for (i = 0; i < NUM_THREADS; i++)
    {
        pthread_join(threads[i], &status);
    }
}

int main()
{
    int type;
    cout << "Choose type of run (1 - normal, 2 - parallel) : ";
    cin >> type;
    clock_t init, final;
    init = clock();
    if (type == 1)
    {
        runNormal();
    }
    else if (type == 2)
    {
        runParallel();
    }
    else
    {
        cout << "Your choice is wrong.";
    }
    final = clock();
    double duration = (double) (final - init) / CLOCKS_PER_SEC;
    cout << "Duration : " << duration << " seconds." << endl;

    pthread_exit(NULL);
    return 0;
}

私のラップには 4 つのコアがあるため、4 つのスレッドで実行します。システム モニターで見たところ、並列モードでは 4 つのコアを同時に使用し、通常モードでは 1 つのコアしか使用していませんが、通常モードの継続時間は短くなっています。

4

1 に答える 1

1

マルチスレッドアプリケーションでどのように機能するかを明確にするために、回答https://stackoverflow.com/a/2962914/1689451を参照してください。clock

このようにしてみてください:

    struct timespec start, finish;
    double elapsed;
    clock_gettime(CLOCK_MONOTONIC, &start);
    if (type == 1)
    {
        runNormal();
    }
    else if (type == 2)
    {
        runParallel();
    }
    else
    {
        cout << "Your choice is wrong.";
    }
    clock_gettime(CLOCK_MONOTONIC, &finish);

    elapsed = (finish.tv_sec - start.tv_sec);
    elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;
    cout << " Duration : " << elapsed << " seconds." << endl;

完全を期すために、次のようにビルドしました(ファイル名par.cpp):

make CXXFLAGS="-pthread -O3 -lrt" LDLIBS=-lrt -B par && ./par
于 2012-11-14T08:00:27.530 に答える