2014-03-26 29 views
-2

當我在cuda中計算`A.transpose * A'時會出現一些問題。計算矩陣A.transpose * A在cuda

假設A是M * N矩陣,並存儲在列優先,我嘗試使用此功能cublasSgemm_v2這是在CUBLAS的矩陣 - 矩陣相乘API

這樣的:

cublasSgemm_v2(handle,CUBLAS_OP_T,CUBLAS_OP_N,N,N,M,&al,A,N,A,M,&beta,A_result,N) 

在調用這個函數之前,我測試矩陣A,它看起來不錯,但它顯示參數8是非法的,我不知道爲什麼。

因此,我決定使用另一個API來計算A.tanspose * A cublas<t>syrk()。返回的結果存儲在矩陣的下部或上部,這意味着矩陣的其餘部分未被引用,以及如何編寫內核以將元素複製到對稱部分?

另一個問題是我的程序有時會崩潰(可能是三分之一的可能性)在像cudaMalloc或cbulascreate或其他地方的代碼的開始,我只是修改代碼中的一些代碼,並且它之前運行很多次,這可能是什麼原因?

謝謝

+0

請提供其他人可以複製,粘貼,編譯和運行以重現問題的最小代碼。 – JackOLantern

回答

0

你必須仔細閱讀cublas gemm documentation

有一種方法可以計算A' * A直接與cublas<T>gemm,但它很棘手。

cublasSgemm(handle, CUBLAS_OP_T, CUBLAS_OP_N, N, K, M, &alpha, 
    A, M, A, M, &beta, B, N); 

這是一種有點黑客 - 一個是您存儲在列優先順序,並K = N尺寸A(MxN)的矩陣。 爲此,作爲迴應您將得到B = A' * A

+0

謝謝。有用。爲什麼必須設置K而不是N. – Zziggurats

+0

它不一定是'K'。我只用它來顯示參數的使用。當然它也可以是'N'。 – hubs