関数を呼び出すと、実行時間は6.8秒です。スレッド時間は3.4秒、2スレッド使用時は1.8秒から呼び出します。どの最適化を使用しても、配給量は同じままです。
Visual Studioの時間は、予想される3.1、3、1.7秒のようです。
#include<math.h>
#include<stdio.h>
#include<windows.h>
#include <time.h>
using namespace std;
#define N 400
float a[N][N];
struct b{
int begin;
int end;
};
DWORD WINAPI thread(LPVOID p)
{
b b_t = *(b*)p;
for(int i=0;i<N;i++)
for(int j=b_t.begin;j<b_t.end;j++)
{
a[i][j] = 0;
for(int k=0;k<i;k++)
a[i][j]+=k*sin(j)-j*cos(k);
}
return (0);
}
int main()
{
clock_t t;
HANDLE hn[2];
b b_t[3];
b_t[0].begin = 0;
b_t[0].end = N;
b_t[1].begin = 0;
b_t[1].end = N/2;
b_t[2].begin = N/2;
b_t[2].end = N;
t = clock();
thread(&b_t[0]);
printf("0 - %d\n",clock()-t);
t = clock();
hn[0] = CreateThread ( NULL, 0, thread, &b_t[0], 0, NULL);
WaitForSingleObject(hn[0], INFINITE );
printf("1 - %d\n",clock()-t);
t = clock();
hn[0] = CreateThread ( NULL, 0, thread, &b_t[1], 0, NULL);
hn[1] = CreateThread ( NULL, 0, thread, &b_t[2], 0, NULL);
WaitForMultipleObjects(2, hn, TRUE, INFINITE );
printf("2 - %d\n",clock()-t);
return 0;
}
時間:
0 - 6868
1 - 3362
2 - 1827
CPU-Core 2 Duo T9300
OS-Windows 8、64ビット
コンパイラ:mingw32-g ++。exe、gccバージョン4.6.2
編集:
別のアプリケーションを試しても、同じ結果で別の順序を試しました。タスクマネージャーは、機能と1つのスレッドで約50%、2つのスレッドで100%のCPU使用率を示しています
各呼び出し後のすべての要素の合計は同じです:3189909.237955
Cygwinの結果:2.5、2.5、および2.5秒Linuxの結果(pthread):3.7、3.7、および2.1秒
@borisbnの結果:0-14461-14392-721。