MSVC中的多线程显示没有任何改进

时间:2014-02-14 20:43:17

标签: multithreading visual-studio c++11

我正在尝试运行以下代码来测试我可以在我的系统上获得的加速,并检查我的代码是多线程的。在linux上使用gcc,得到大约7的因子。在Windows上使用Visual Studio,我没有任何改进。在MSVS 2012中,我设置/ Qpar和/ MD ......我错过了什么吗?我做错了什么?

#include <iostream>
#include <thread>
#ifdef WIN32
    #include <windows.h>
    double getTime() {
      LARGE_INTEGER freq, val;
      QueryPerformanceFrequency(&freq);
      QueryPerformanceCounter(&val);
      return 1000*(double)val.QuadPart / (double)freq.QuadPart;
    };
    #define clock_type double
#else
    #include <ctime>
    #define clock_type std::clock_t
    #define getTime std::clock
#endif
static const int num_threads = 10;

//This function will be called from a thread
void f()
{
   volatile double d=0;
   for(int n=0; n<10000; ++n)
     for(int m=0; m<10000; ++m)
       d += d*n*m;
}


int main()
{
    clock_type c_start = getTime();
    auto t_start = std::chrono::high_resolution_clock::now();
    std::thread t[num_threads];
    //Launch a group of threads
    for (int i = 0; i < num_threads; ++i) {
        t[i] = std::thread(f);
    }
    //Join the threads with the main thread
    for (int i = 0; i < num_threads; ++i) {
        t[i].join();
    }
    clock_type c_end = getTime();
    auto t_end = std::chrono::high_resolution_clock::now();

    std::cout << "CPU time used: "
          << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC
          << " ms\n";
    std::cout << "Wall clock time passed: "
          << std::chrono::duration_cast<std::chrono::milliseconds>(t_end - t_start).count()
          << " ms\n";

    std::cout << "Acceleration factor: "
          << 1000.0 * (c_end-c_start) / CLOCKS_PER_SEC / std::chrono::duration_cast<std::chrono::milliseconds>(t_end - t_start).count() << "\n";

    return 0;
}

使用MSVS的输出是:

使用的CPU时间:1003.64 ms

挂钟时间过去了:998毫秒

加速因子:1.00565

在Linux中,我得到:

使用的CPU时间:5264.83 ms

挂钟时间过去了:698 ms

加速因子:7.54274

编辑1:f()中矩阵的大小从1000增加到10000。

编辑2:使用QueryPerformanceCounter添加了getTime()函数,并包含#define以在std :: clock()和getTime()之间切换

1 个答案:

答案 0 :(得分:0)

在MSVC上,clock返回wall time,因此不符合标准。