我正在尝试运行以下代码来测试我可以在我的系统上获得的加速,并检查我的代码是多线程的。在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()之间切换