Ver Mensaje Individual
  #10 (permalink)  
Antiguo 16/08/2014, 14:28
dmorill
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Uso 100% CPU para un programa hecho en c++

Hola, gracias por todas respuestas. Luego de indagar y buscar la respuesta si era la ya expuesta en este foro, la cantidad de nucleos que trabajan simultáneamente, es decir los threads o hilos de procesamiento. Programando con 8 threads el cpu va a 100%.

A quién le interese voy a adjuntar el código del for inicial, pero para que se realice con threads, el número de threads se define en la variable: "nucleos". Además uso una barrera para que haya problemas mientras los threads trabajan simultáneamente.

Código C++:
Ver original
  1. #include <ctime>    //reloj
  2. #include <iostream>
  3. #include <math.h>
  4. #include <thread>
  5. #include <vector>
  6. #include <mutex>
  7. using namespace std;
  8. static mutex barrier;
  9.  
  10. void mostrarTiempo(clock_t tiempo);
  11. vector<long long> bounds(long long parts, long long mem);
  12. void contar(double& sum, long long i, long long j);
  13.  
  14. int main(){
  15.     clock_t tiempo = clock();    //iniciar el reloj
  16.     int nucleos = 8, i = 0;
  17.     long long numerote = 0;
  18.     //numerote = 1000000;
  19.     numerote = 10000000000;
  20.     double sum = 0, sum1 = 0;
  21.     vector<thread> vNucleos;
  22.     vector<long long> limits = bounds(nucleos, numerote);
  23.     if (limits[0] == 0) limits[0] = 1;
  24.     for (i = 0; i < nucleos; i++){
  25.         vNucleos.push_back(thread(contar, ref(sum), limits[i], limits[i + 1]));
  26.     }
  27.     for (auto &t : vNucleos){
  28.         t.join();
  29.     }
  30.    
  31.     cout << endl << " " << sum << endl;
  32.     mostrarTiempo(tiempo);
  33.    
  34.     for (i = 1; i < numerote; i++){
  35.         sum1 = sum1 + log(double(i));
  36.     }
  37.     cout << endl << " " << sum1 << endl;
  38.    
  39.  
  40.     cout << "Pulse para salir...";
  41.     cin.sync();
  42.     cin.get();
  43.     return 0;
  44. }
  45.  
  46.  
  47. void mostrarTiempo(clock_t tiempo){
  48.     tiempo = clock() - tiempo;
  49.     cout << endl << "Tiempo de ejecución es " << double(tiempo) / CLOCKS_PER_SEC << " seg." << endl;
  50. }
  51. void contar(double& sum, long long i, long long j){
  52.     long long k; double sumar = 0;
  53.     for (k = i; k < j; k++){
  54.         sumar = sumar + log(double(k));
  55.     }
  56.     lock_guard<mutex> block_trheads_until_Finish_this_job(barrier);
  57.     sum = sum + sumar;
  58. }
  59. vector<long long> bounds(long long parts, long long mem){
  60.     vector<long long>bnd;
  61.     long long delta = mem / parts;
  62.     long long reminder = mem % parts;
  63.     long long N1 = 0, N2 = 0;
  64.     bnd.push_back(N1);
  65.     for (long long i = 0; i < parts; ++i) {
  66.         N2 = N1 + delta;
  67.         if (i == parts - 1)
  68.             N2 += reminder;
  69.         bnd.push_back(N2);
  70.         N1 = N2;
  71.     }
  72.     return bnd;
  73. }