2012-08-27 86 views
0

我在Cuda中實現了RNS蒙哥馬利求冪。Cuda,爲什麼我不能使用多個流處理器?

一切都很好,一切都很好。它只在一個SM上運行。

但是,到目前爲止,我只關注單個exp的並行化。我現在想要做的就是在幾個實驗室進行測試。也就是說,我希望將第i個下一個exp分配給一個空閒的SM。

我試過了,最後的時間總是線性增長,那就是所有的exp都分配給了同一個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鈦(8 SM)

回答

2

塊中的所有線程始終運行在同一個SM上。您需要啓動多個塊才能使用其他SM。

您的流似乎有問題 - 您是否爲每個流調用cudaStreamCreate?在我的系統上,如果我不使用一個,它會與SEGFAULT崩潰。

+0

是的,我增加了塊號,它的工作。謝謝。只是一個問題,是否有一種方法讓__me的多重平行運行(每個都在不同的SM上),或者您建議的方法是唯一的和/或正確的方法? @Eugene – elect

+0

我只注意到你正在使用流。你在哪裏創建流,你如何檢測到流不併發?以下代碼嘗試並行運行代碼(我的內核太小並且在下一個啓動之前完成): \t for(i = 0; i <10; i ++){CUDA_CHECK_RETURN(cudaStreamCreate(stream + i) ); bit_verse <<< 1,WORK_SIZE,WORK_SIZE * sizeof(int),stream [i] >>>(d); \t \t CUDA_CHECK_RETURN(cudaStreamDestroy(stream [i])); \t} – Eugene

相關問題