正在测试和计时一些计算(试图找到一个在与我的处理器上的所有 4 个线程并行时运行速度快 4 倍的 for 循环)当我注意到这个循环不会以 100% 的 cpu 使用率运行,尽管编译器报告它被并行化了。它只会以 25% 的 CPU 使用率运行。我的处理器上的每个核心都应该有自己的 arr4 副本,这是一个分配在堆栈上的 C 样式数组,并且每个核心都应该重复修改该堆栈数组的每个值。最后,计时器以秒为单位打印所用时间。如果并行化的时间需要 40 秒,我希望没有并行化的 for 循环的时间只需不到 4*40 秒或 160 秒。优化设置为最大速度,物理内存上的堆栈大小设置为 8 亿字节(以防止堆栈溢出)。反正,
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <malloc.h>
int main (void)
{
clock_t begin, end;
double time_spent;
begin = clock();
{
//int j;
#pragma loop(hint_parallel(4))
#pragma loop(ivdep)
for (int j=0; j < 8; ++j)
{
int * __restrict const arr4 = (int *) _alloca(16000000*sizeof(int));
for (int z = 0; z < 16000000; ++z)
{
arr4[z] = z;
}
#pragma loop(no_vector)
for (int i = 0; i < 16000000; ++i)
{
for (int k = 0; k < 160; ++k)
{
arr4[i] -= (7 - arr4[i] * 6 % (i+77) + 5 * 4 / 3 + 3 % 2 + 1 - (i+7));
arr4[i] += ((77 - 2 - (i+9)/2 + arr4[i]));
arr4[i] *= (8 - 2 + 6 % 3 / 2 + (i+6));
}
}
printf(" %i ", arr4[((j+1)*666)%16]);
}
}
end = clock();
time_spent = (double)(end - begin) / ((double)CLOCKS_PER_SEC);
printf("Test1: time as a floating point type is %f \n", time_spent);
return 0;
}
这个修改后的例子也产生了同样的 25% CPU 问题。
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <malloc.h>
int main (void)
{
clock_t begin, end;
double time_spent;
begin = clock();
int * __restrict const arr4 = (int *) _alloca(16000000*sizeof(int));
#pragma loop(hint_parallel(4))
#pragma loop(ivdep)
for (int j=0; j < 8; ++j)
{
for (int i = 0; i < 16000000; ++i)
{
int v = i; // eliminate initialization pass (z loop)
for (int k = 0; k < 160; ++k)
{
v -= (7 - v * 6 % (i+77) + 5 * 4 / 3 + 3 % 2 + 1 - (i+7));
v += ((77 - 2 - (i+9)/2 + v));
v *= (8 - 2 + 6 % 3 / 2 + (i+6));
}
arr4[i] = v;
}
//printf(" %i ", arr4[((j+1)*666)%16]);
}
end = clock();
//time_spent = (double)(end - begin) / ((double)CLOCKS_PER_SEC);
time_spent = (double)(end - begin);
printf(" %i ", arr4[666]);
printf("Test1: time as a floating point type is %f \n", time_spent);
return 0;
}