使用线程进行内核的cublas调用?

时间:2014-10-24 12:41:15

标签: cuda cublas

在阅读下面之前! :

据我了解,当你从内核打电话给cublas时:

  

cublas调用本身就是内核

     

线程和块由cublas调用

管理      

通过1个线程(和1个块)启动cublas调用然后它   检查元素的数量和线程/块的数量   自动。因此,您没有指定线程数/块数   你打了一个古巴拉斯电话。

我正在启动一个包含1个线程和1个块的内核,如上所述。

__global__ void (...)
{

    ...
    cublasCtrsm( CublasHandle , CUBLAS_SIDE_LEFT ,CUBLAS_FILL_MODE_LOWER , CUBLAS_OP_N , CUBLAS_DIAG_NON_UNIT , M , N , &alpha , inCov, M  ,  inSample, M )

    for ( int i = 0; i < N; i++ )

        cublasCdotc( CublasHandle , M , inCoil + i * M  , 1 , inSample + i * M  , 1 , devImage + i );

}

现在,这段代码运行正常(我正在拍摄一张图片),但for循环需要花费太多时间。我想对循环进行优化。

所以,我试过了:

int i = threadIdx.x + blockDim.x * blockIdx.x;

if ( i < N ) 
    cublasCdotc( CublasHandle , M , inCoil + i * M  , 1 , inSample + i * M  , 1 , devImage + i );

但是,正如我所说,我用1个线程和1个块来调用内核。

所以,只会被1个线程执行,对吧? (这就是为什么我没有拍摄我想要的图像,只有1个像素)

这有一个概念,表达式i * M不会被评估为所有N.

我的问题是如何实现我的目标?

1 个答案:

答案 0 :(得分:1)

对于任何可能理解答案或想要了解的人,无论如何......

我带来了这个解决方案。

在全球职能中:

int i = threadIdx.x + blockIdx.x * blockDim.x;

    devImage[ i ] = 0;

    if ( i < N )
    {
        for ( int j = 0; j < M; j++ )
        {
             devImage[ i ] +=   inCoil[  i * M + j ] * inSample[  i * M + j ] - inCoil[  i * M + j ] \
                    * inSample[  i * M + j ] + inCoil[  i * M + j ] *  inSample[  i * M + j ] + inCoil[  i * M + j ] \
                    * inSample[  i * M + j ];

        }
    }

我做了一个小循环(j

现在,我想不出一种快速运行cublasCdotc的方法。