我尝试学习 Grand Central Dispatch (GCD) 并使用以下代码进行测试:
使用 GCD:
#include <dispatch/dispatch.h>
#include <vector>
#include <cstdlib>
#include <iostream>
int main(int argc, char *argv[])
{
const int N = atoi(argv[1]);
__block std::vector<int> a(N, 0);
dispatch_apply(N,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^(size_t i)
{
a[i] = i;
#ifdef DEBUG
if ( i % atoi(argv[2]) == 0)
std::cout << a[i] << std::endl;
#endif
});
return 0;
}
没有 GCD:
#include <vector>
#include <cstdlib>
#include <iostream>
int main(int argc, char *argv[])
{
const int N = atoi(argv[1]);
std::vector<int> a(N, 0);
for (int i = 0; i < N; i++)
{
a[i] = i;
#ifdef DEBUG
if ( i % atoi(argv[2]) == 0)
std::cout << a[i] << std::endl;
#endif
}
return 0;
}
GCD的测试结果:
$ time ./testgcd 100000000 10000000
4.254 secs
没有 GCD 的测试:
$ time ./nogcd 100000000 10000000
1.462 secs
我认为 GCD 应该减少执行时间,但结果却相反。我不确定我是否滥用了 GCD。操作系统环境是 Mac OS X 10.8 和 Xcode 4.5。编译器是 Clang++ 3.1。硬件是带有 i5 CPU 的 Macbook Pro,它有两个内核。
为了比较,我使用 OpenMP(在同一台笔记本电脑上也使用 Xcode 4.5 附带的 GCC):
#include <vector>
#include <cstdlib>
int main(int argc, char *argv[])
{
const int N = atoi(argv[1]);
std::vector <int> a(N, 0);
#pragma omp parallel for
for (int i = 0; i < N; i++)
a[i] = i;
return 0;
}
和 w/wo (-fopenmp),我有两个可执行文件要测试,
编译时带有-fopenmp
标志:
$ time ./testopenmp 100000000
1.280 secs
编译时没有-fopenmp
标志:
$ time ./testnoopenmp 100000000
1.626 secs
使用 OpenMP,可以减少执行时间。