0

したがって、スレッドの私のコードは次のとおりです。

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); でクラッシュする理由がわかりません。

4

0 に答える 0