いくつかの計算のテストとタイミング調整を行っていました (プロセッサ上の 4 つのスレッドすべてと並列に実行すると 4 倍速く実行される for ループを見つけようとしていました)。並列化しました。25% の CPU 使用率でのみ実行されます。私のプロセッサの各コアには、スタックに割り当てられた C スタイルの配列である arr4 の独自のコピーがあり、各コアはそのスタック配列の各値を繰り返し変更することになっていました。最後に、タイマーが秒単位でかかった時間を出力します。並列化の時間が 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;
}