Mar*_* A. 5 cuda matrix cublas
我正在使用CUBLAS(Cuda Blas库)进行矩阵运算.
是否可以使用CUBLAS来实现矩阵项的取幂/均方根?
我的意思是,拥有2x2矩阵
1 4
9 16
Run Code Online (Sandbox Code Playgroud)
我想要的是一个提升到给定值的函数,例如2
1 16
81 256
Run Code Online (Sandbox Code Playgroud)
并计算均方根,例如
1 2
3 4
Run Code Online (Sandbox Code Playgroud)
这可能与CUBLAS有关吗?我找不到适合这个目标的函数,但我先问这里开始编写自己的内核.
Jon*_*rsi 10
因此,这很可能是你不拥有自己实现,因为该库不会为你做.(根据BLAS 3级例程,可能有一些方法可以实现它 - 当然是矩阵元素的平方 - 但它会涉及昂贵的,否则不必要的矩阵向量乘法.我仍然不知道你是怎么做的d做squareroot操作).原因是这些操作不是真正的线性代数程序; 取每个矩阵元素的平方根并不真正对应于任何基本的线性代数运算.
好消息是这些元素操作在CUDA中实现起来非常简单.同样,有很多调优选项可以用来获得最佳性能,但是可以很容易地开始使用.
与矩阵加法运算一样,您将在此将NxM矩阵视为(N*M) - 长度向量; 矩阵的结构对于这些元素运算无关紧要.因此,您将传入指向矩阵的第一个元素的指针,并将其视为单个N*M数列表.(我假设你在float这里使用s,正如你所说的那样SGEMM,SAXPY早些时候.)
内核是实现操作的CUDA代码的实际位,非常简单.现在,每个线程将计算一个数组元素的平方(或平方根).(这是否是最佳性能是你可以测试的).所以内核看起来如下所示.我假设你做的事情就像B_ij =(A_ij)^ 2; 如果你想在现场进行操作,例如A_ij =(A_ij)^ 2,你也可以这样做:
__global__ void squareElements(float *a, float *b, int N) {
/* which element does this compute? */
int tid = blockDim.x * blockIdx.x + threadIdx.x;
/* if valid, squre the array element */
if (tid < N)
b[tid] = (a[tid]*a[tid]);
}
__global__ void sqrtElements(float *a, float *b, int N) {
/* which element does this compute? */
int tid = blockDim.x * blockIdx.x + threadIdx.x;
/* if valid, sqrt the array element */
if (tid < N)
b[tid] = sqrt(a[tid]); /* or sqrtf() */
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您的错误略有增加,那么'sqrtf()'函数的最大误差为3 ulp(最后一个单位)的速度要快得多.
如何调用这些内核将取决于您执行操作的顺序.如果您已经在这些matricies上进行了一些CUBLAS调用,那么您将需要在已经存在于GPU内存中的阵列上使用它们.