したがって、スレッドの私のコードは次のとおりです。
DWORD WINAPI ThreadFunc1(LPVOID lpParam )
{
THREAD_DATA *ptrDat = (THREAD_DATA *)(lpParam);
int loc_N = ptrDat->loc_N ;
int ntimes = ptrDat->ntimes;
__m128d rx0, ry0, result0;
for( int ip= 0; ip < ntimes; ip++ ) {
result0 = _mm_setzero_pd();
if (loc_N%2 != 0){
rx0 = _mm_load_sd(ptrDat->X);
ry0 = _mm_load_sd(ptrDat->Y);
ry0 = _mm_mul_pd(rx0, ry0);
result0 = _mm_add_pd(result0, ry0);
}
for( int i = loc_N%2; i < loc_N; i+=2 ) {
rx0 = _mm_load_pd(ptrDat->X+i);
ry0 = _mm_load_pd(ptrDat->Y+i);
ry0 = _mm_mul_pd(rx0, ry0);
result0 = _mm_add_pd(result0, ry0);
}
_mm_storeh_pd ( &ptrDat->res, _mm_add_pd(result0, _mm_shuffle_pd( result0, result0,1 )));
}
ptrDat->ret = 0;
return 0;
}
フラグメントの主な機能があります:
loc_N = N/np;
N = loc_N*np;
try
{
X = new double[N];
Y = new double[N];
}
catch(bad_alloc aa)
{
cout << "memory allocation error\n";
system("pause");
exit(1);
}
//preparation of X, Y
int i;
for(i=0; i<N; i++)
{
X[i] = (double)(i+1);
Y[i] = 1.0;
}
for(ip=0; ip<np; ip++)
{
tDat[ip].loc_N = loc_N;
tDat[ip].N = N;
tDat[ip].ntimes = ntimes;
tDat[ip].X = X + ip*loc_N;
tDat[ip].Y = Y + ip*loc_N;
tDat[ip].threadNo = ip;
hThread[ip] = CreateThread(
NULL,
0,
ThreadFunc1,
(void*)&tDat[ip],
0,
NULL
);
if( !hThread[ip] ) {
exit(1);
}
}
loc_N は、各スレッドの要素数です。ベクトル x と y の N サイズ。ntimes - 繰り返しアルゴリズムの数です。threadNo - スレッド番号。
スレッドが 3 つあるときにプログラムが ry0 = _mm_load_pd (ptrDat-> y + i); でクラッシュする理由がわかりません。