Parallel processing Cuda,为什么我不能使用多个流处理器?

Parallel processing Cuda,为什么我不能使用多个流处理器?,parallel-processing,cuda,scaling,cuda-streams,Parallel Processing,Cuda,Scaling,Cuda Streams,我在Cuda中实现了RNS蒙哥马利指数运算 一切都很好,一切都很好。它只在一个SM上运行 但是,到目前为止,我只关注单个exp的并行化。我现在要做的是使用几个exp进行动态测试。也就是说,我希望将第I个下一个exp分配给自由SM 我试过了,最后的时间总是线性增长的,也就是说,所有的exp都分配给同一个SM 然后我换成了溪流,但一切都没变 但是我从来没有用过,所以可能我做错了什么 代码如下: void __smeWrapper() { cudaEvent_t start, stop;

我在Cuda中实现了RNS蒙哥马利指数运算

一切都很好,一切都很好。它只在一个SM上运行

但是,到目前为止,我只关注单个exp的并行化。我现在要做的是使用几个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 );
void\uuu{
cudaEvent\u t启动、停止;
cudaStream_t stream0、stream1、stream2;
浮动时间;
无符号整数j,i,tmp;
cudaEventCreate(&start);
cudaEventCreate(&stop);
dim3螺纹锁紧(设定尺寸,(设定尺寸+1)/2);
setCudDevice();
s_transferDataToGPU();
如果(cudaDeviceSetCacheConfig(cudaFuncCachePreferL1)!=cudaSuccess)
printf(“cudaDeviceSetCacheConfig错误!”);
cudaEventRecord(开始,0);
//对于(i=0;i(&uuu s_x[i*(2*设置大小+1)]、uuu B2modN、uuu基、uuu mmi NinB、uuuu mmi Bimodbi、uuu Bi inuar、uuu dbg、uu NinAUar、,
__mmi_BinAUar、uuu mmi_Ajmodaj、uu Ajmodar、uu mmi_Armodar、uuu AjinB、uuu minusAinB、&uuuu z[i*(2*设置大小+1)]、uu e);
i=1;
__me>(&uuuu s_x[i*(2*SET_usize+1)]、uuuu B2modN、uuuu基、uuuu mmi NinB、uuuu mmi Bimodbi、uuuu biu inuar、uuuu dbg、uuuu NinAUar、,
__mmi_BinAUar、uuu mmi_Ajmodaj、uu Ajmodar、uu mmi_Armodar、uuu AjinB、uuu minusAinB、&uuuu z[i*(2*设置大小+1)]、uu e);
i=2;
__me>(&uuuu s_x[i*(2*SET_usize+1)]、uuuu B2modN、uuuu基、uuuu mmi NinB、uuuu mmi Bimodbi、uuuu biu inuar、uuuu dbg、uuuu NinAUar、uuuuu mmi biuar、,
__mmi_Ajmodaj、u Ajmodar、u mmi_Armondar、u AjinB、u minusAinB、&uu z[i*(2*套尺寸+1)]、u e);
//printf(“\n%s\n\n”,cudaGetErrorString(cudaGetLastError());
//}
cudaEventRecord(停止,0);
CUDAEVENTS同步(停止);
CUDAEVENTERASEDTIME(时间、开始、停止(&T));
printf(“GPU%fµs:%f ms\n”,时间*1000,时间);
cudaEventDestroy(启动);
cudaEventDestroy(停止);

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

一个块中的所有线程始终在同一个SM上运行。您需要启动多个块才能使用其他SMs


您的流似乎有问题-您是否为每个流调用cudaStreamCreate?在我的系统上,如果我不使用SEGFULT,它会崩溃。

是的,我增加了块数,它工作了。谢谢。我只是问一个问题,有没有办法让多个istance并行运行(每个都在不同的SM上)或者你建议的方法是唯一和/或正确的方法?@EugeneI只是注意到你在使用流。你在哪里创建流,以及如何检测流不是并发的?以下代码尝试并行运行代码(我的内核太小,在下一个开始之前就已经完成):对于(i=0;i<10;i++){CUDA_CHECK_RETURN(cudaStreamCreate(stream+i));位反转(d);CUDA_CHECK_RETURN(cudaStreamDestroy(stream[i]);}