在阅读下面之前! :
据我了解,当你从内核打电话给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.
我的问题是如何实现我的目标?
答案 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的方法。