2015-01-11 3 views
0

Возможно, я запутался в потоках, но мое понимание потоков конфликтует между собой.Если программа pthread занимает больше времени

Я создал программу, которая использует POSIX pthread s. Без использования этих потоков программа занимает 0.061723 секунды для запуска, а потоки - 0.081061 секунды для запуска.

Сначала я подумал, что это то, что должно произойти, поскольку потоки позволяют чему-то случиться, в то время как другие вещи должны быть в состоянии. то есть обрабатывать большое количество данных в одном потоке, сохраняя при этом еще один отзывчивый интерфейс, это будет означать, что обработка данных займет больше времени, поскольку процессор делит свое время между обработкой пользовательского интерфейса и обработкой данных.

Однако, конечно, точка многопоточности заключается в том, чтобы программа использовала преимущества нескольких процессоров/ядер?

Как вы можете сказать, я что-то среднее, поэтому извините меня, если это простой вопрос.

Но что я должен ожидать от программы?

Я запускаю это в середине 2012 года Macbook Pro 13 "базовой модели. Процессор 22 нм «Ivy Bridge» 2,5 ГГц Intel «Core i5» процессор (3210M), с двумя независимыми процессор «сердечников» на одном кристалле кремния

ОБНОВЛЕНИЕ С КОДОМ

Это в основная функция. Я не добавить объявление переменной для удобства, но я уверен, что вы можете выяснить, что каждый делает его именем:

//   Loop through all items we need to process 
// 
while (totalNumberOfItemsToProcess > 0 && numberOfItemsToProcessOnEachIteration > 0 && startingIndex <= totalNumberOfItemsToProcess) 
{ 
    // As long as we have items to process... 
    // 
    //  Align the index with number of items to process per iteration 
    // 
    const uint endIndex = startingIndex + (numberOfItemsToProcessOnEachIteration - 1); 

    // Create range 
    // 
    Range range = RangeMake(startingIndex, 
          endIndex); 

    rangesProcessed[i] = range; 

    // Create thread 
    // 
    //  Create a thread identifier, 'newThread' 
    // 
    pthread_t newThread; 

    //  Create thread with range 
    // 
    int threadStatus = pthread_create(&newThread, NULL, processCoordinatesInRangePointer, &rangesProcessed[i]); 

    if (threadStatus != 0) 
    { 
     std::cout << "Failed to create thread" << std::endl; 

     exit(1); 
    } 

    // Add thread to threads 
    // 
    threadIDs.push_back(newThread); 

    // Setup next iteration 
    // 
    //  Starting index 
    // 
    //   Realign the index with number of items to process per iteration 
    // 
    startingIndex = (endIndex + 1); 

    //  Number of items to process on each iteration 
    // 
    if (startingIndex > (totalNumberOfItemsToProcess - numberOfItemsToProcessOnEachIteration)) 
    { 
     // If the total number of items to process is less than the number of items to process on each iteration 
     // 
     numberOfItemsToProcessOnEachIteration = totalNumberOfItemsToProcess - startingIndex; 
    } 

    // Increment index 
    // 
    i++; 
} 

std::cout << "Number of threads: " << threadIDs.size() << std::endl; 

//   Loop through all threads, rejoining them back up 
// 
for (size_t i = 0; 
     i < threadIDs.size(); 
     i++) 
{ 
    //  Wait for each thread to finish before returning 
    // 
    pthread_t currentThreadID = threadIDs[i]; 

    int joinStatus = pthread_join(currentThreadID, NULL); 

    if (joinStatus != 0) 
    { 
     std::cout << "Thread join failed" << std::endl; 

     exit(1); 
    } 
} 

функции обработки:

void processCoordinatesAtIndex(uint index) 
{ 
    const int previousIndex = (index - 1); 

    // Get coordinates from terrain 
    // 
    Coordinate3D previousCoordinate = terrain[previousIndex]; 
    Coordinate3D currentCoordinate = terrain[index]; 

    // Calculate... 
    // 
    //  Euclidean distance 
    // 
    double euclideanDistance = Coordinate3DEuclideanDistanceBetweenPoints(previousCoordinate, currentCoordinate); 

    euclideanDistances[index] = euclideanDistance; 

    //  Angle of slope 
    // 
    double slopeAngle = Coordinate3DAngleOfSlopeBetweenPoints(previousCoordinate, currentCoordinate, false); 

    slopeAngles[index] = slopeAngle; 
} 

void processCoordinatesInRange(Range range) 
{ 
    for (uint i = range.min; 
      i <= range.max; 
      i++) 
    { 
     processCoordinatesAtIndex(i); 
    } 
} 

void *processCoordinatesInRangePointer(void *threadID) 
{ 
    // Cast the pointer to the right type 
    // 
    struct Range *range = (struct Range *)threadID; 

    processCoordinatesInRange(*range); 

    return NULL; 
} 

UPDATE:

Здесь являются моими глобальными переменными, которые, только для простоты - не имеют выхода!

std::vector<Coordinate3D> terrain; 

std::vector<double> euclideanDistances; 
std::vector<double> slopeAngles; 

std::vector<Range> rangesProcessed; 

std::vector<pthread_t> threadIDs; 
+2

В каком направлении вы используете потоки для ускорения работы программы? Подробности имеют значение. Нерестовые потоки имеют накладные расходы. – juanchopanza

+0

У меня есть десять потоков, каждый поток принимает ряд данных из массива координат. Затем выполняет вычисления по этим значениям. i.e thread0 принимает индексы 0-29,999. thread1 принимает индексы 30,000-59,999 и т. д. –

+0

@AdamCarter Фактически, вводя многопоточность в неправильном направлении, он может фактически замедлить работу вашей программы. Трудно сказать. –

ответ

0

Исправьте меня, если я ошибаюсь, но, я думаю, проблема заключалась в том, как измерялось время. Вместо использования clock_t я переместился на gettimeofday(), и это сообщает о более коротком времени, от времени без резьбы 22.629000 ms до времени с резьбой 8.599000 ms.

Это похоже на людей?

Конечно, мой первоначальный вопрос был основан на том, будет ли многопоточная программа ДОЛЖНЫ быть быстрее или нет, поэтому я не буду отмечать этот ответ как правильный по этой причине.

+0

, если вы выполняете многопоточную программу в одном ядре, она, вероятно, будет работать медленнее, чем для одной задачи, выполняемой в однопоточной программе. – Micka

+0

Спецификации моего компьютера (в моем вопросе) говорят о двух ядрах на одном чипе, поэтому не должно быть многопоточным быстрее? –

+0

ускорение от 22.629000 мс до 8.599000 мс быстрее, не так ли? Очевидно, что объем работы все тот же, поэтому время процессора не уменьшается. Поскольку для создания и синхронизации потоков есть некоторые накладные расходы, время CPU даже немного увеличивается. – Micka

Смежные вопросы