0

Cuda で RNS モンゴメリべき乗を実装しました。

すべてがうまくいっている。1 つの SM で実行されます。

しかし、これまでのところ、単一の exp の並列化に焦点を当てています。私が今やりたいことは、いくつかの exp をその場でテストすることです。つまり、i 番目の次の exp が空いている SM に割り当てられるようにします。

私が試したところ、最後の時間は常に直線的に増加していました。つまり、すべての経験値が同じ SM に割り当てられていました。

その後、ストリームに切り替えましたが、何も変わりませんでした。

しかし、私はそれらを使用したことがないので、何か間違ったことをしているのかもしれません..

これはコードです:

void __smeWrapper() {
    cudaEvent_t start, stop;
    cudaStream_t stream0, stream1, stream2;
    float time;
    unsigned int j, i, tmp;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);
    dim3 threadsPerBlock(SET_SIZE, (SET_SIZE+1)/2);

    setCudaDevice();

    s_transferDataToGPU();

    if(cudaDeviceSetCacheConfig(cudaFuncCachePreferL1) != cudaSuccess)
        printf("cudaDeviceSetCacheConfig ERROR!");

    cudaEventRecord( start, 0 );

    //for(i=0; i<EXPONENTIATION_NUMBER; i++)    {
    i=0;
        __me<<< 1, threadsPerBlock, 0, stream0 >>>(&__s_x[i*(2*SET_SIZE + 1)],     __B2modN, __bases, __mmi_NinB, __mmi_Bimodbi, __Bi_inAUar, __dbg, __NinAUar,    
                                            __mmi_BinAUar, __mmi_Ajmodaj, __Ajmodar, __mmi_Armodar, __AjinB, __minusAinB, &__z[i*(2*SET_SIZE + 1)], __e);
    i=1;
        __me<<< 1, threadsPerBlock, 0, stream1 >>>(&__s_x[i*(2*SET_SIZE + 1)], __B2modN, __bases, __mmi_NinB, __mmi_Bimodbi, __Bi_inAUar, __dbg, __NinAUar,
                                        __mmi_BinAUar, __mmi_Ajmodaj, __Ajmodar, __mmi_Armodar, __AjinB, __minusAinB, &__z[i*(2*SET_SIZE + 1)], __e);
    i=2;
    __me<<< 1, threadsPerBlock, 0, stream2 >>>(&__s_x[i*(2*SET_SIZE + 1)], __B2modN, __bases, __mmi_NinB, __mmi_Bimodbi, __Bi_inAUar, __dbg, __NinAUar, __mmi_BinAUar,
                                                                    __mmi_Ajmodaj, __Ajmodar, __mmi_Armodar, __AjinB, __minusAinB, &__z[i*(2*SET_SIZE + 1)], __e);
        //printf("\n%s\n\n", cudaGetErrorString(cudaGetLastError()));
    //}

cudaEventRecord( stop, 0 );
cudaEventSynchronize( stop );
cudaEventElapsedTime( &time, start, stop );
    printf("GPU %f µs : %f ms\n", time*1000, time);

cudaEventDestroy( start );
cudaEventDestroy( stop );

Ubuntu 11.04 64b、Cuda 5 RC、560 Ti (8 SM)

4

1 に答える 1

2

ブロックのすべてのスレッドは、常に同じ SM で実行されます。他の SM を使用するには、複数のブロックを開始する必要があります。

ストリームに何か問題があるようです - すべてのストリームに対して cudaStreamCreate を呼び出しますか? 私のシステムでは、SEGFAULT を使用しないとクラッシュします。

于 2012-08-27T17:56:26.833 に答える