Как заставить многопоточное приложение использовать все ядра Ubuntu под VMWare? - PullRequest
1 голос
/ 27 июня 2011

У меня есть многопоточное приложение, которое обрабатывает очень большой файл данных.Отлично работает на Windows 7, код полностью на C ++, использует библиотеку pthreads для межплатформенной многопоточности.Когда я запускаю его под Windows на моем Intel i3 - Диспетчер задач показывает все четыре ядра, привязанные к пределу, чего я и хочу.Скомпилировал тот же код, используя рабочую станцию ​​g ++ Ubuntu / VMWare - запущено одинаковое количество потоков, но все потоки выполняются на одном ядре (насколько я могу судить - диспетчер задач показывает, что занято только одно ядро).

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

Обновление : Я настроил VMWare, чтобы увидеть все четыре ядра, а / proc / cpuinfo показывает 4 ядра

Обновление 2 - только что написал простое приложение, чтобы показать проблему - может быть, это только VMWare?- кто-нибудь из Linux хочет попробовать и посмотреть, действительно ли это загружает несколько ядер?Для запуска этого в Windows вам понадобится библиотека pThread - легко загружаемая.И если кто-нибудь может предложить что-нибудь более интенсивное, чем printf, то вперед!

#ifdef _WIN32
#include "stdafx.h"
#endif
#include "stdio.h"
#include "stdlib.h"
#include "pthread.h"

void *Process(void *data)
{
   long id = (long)data;
   for (int i=0;i<100000;i++)
   {
      printf("Process %ld says Hello World\n",id);
   }
   return NULL;
}

#ifdef _WIN32
int _tmain(int argc, _TCHAR* argv[])
#else
int main(int argc, char* argv[])
#endif
{
   int numCores = 1;
   if (argc>1)
      numCores = strtol(&argv[1][2],NULL,10);
   pthread_t *thread_ids = (pthread_t *)malloc(numCores*sizeof(pthread_t));
   for (int i=0;i<numCores;i++)
   {
      pthread_create(&thread_ids[i],NULL,Process,(void *)i);
   }
   for (int i=0;i<numCores;i++)
   {
      pthread_join(thread_ids[i],NULL);
   }
    return 0;
}

1 Ответ

0 голосов
/ 03 июля 2011

Я немного изменил твой код. Я изменил numCores = strtol(&argv[1][2], NULL, 10); на numCores = strtol(&argv[1][0], NULL, 10);, чтобы он работал в Linux, вызвав ./core 4, может быть, вы передаете что-то перед числом ядер или потому что тип _TCHAR равен 3 байта на символ? Не очень хорошо знаком с окнами. Более того, поскольку я не смог загрузить процессор только с помощью printf, я также немного изменил Process.

void *Process(void *data)
{
     long hdata = (long)data;
     long id = (long)data;
     for (int i=0;i<10000000;i++)
     {
         printf("Process %ld says Hello World\n",id);
         for (int j = 0; j < 100000; j++)
         {
               hdata *= j;
               hdata *= j;
               hdata *= j;
               hdata *= j;
               hdata *= j;
               hdata *= j;
               hdata *= j;
               hdata *= j;
               hdata *= j;
               hdata *= j;
               hdata *= j;
               ...
         }
    }

    return (void*)hdata;
}

И теперь, когда я запускаю gcc -O2 -lpthread -std=gnu99 core.c -o core && ./core 4 Вы можете видеть, что все 4 потока работают на 4 разных ядрах, вероятно, они меняются с ядра на ядро ​​одновременно, но все 4 ядра работают сверхурочно.

core.c: In function ‘main’:
core.c:75:50: warning: cast to pointer from integer of different size [-Wint-to-pointer-   cast]
Starting 4 threads
Process 0 says Hello World
Process 1 says Hello World
Process 3 says Hello World
Process 2 says Hello World

Я подтвердил это с помощью htop надеюсь, это поможет .. :) Я запускаю выделенный Debian SID x86_64 с 4 ядрами на случай, если вам интересно.

...