2014-03-26 5 views
-2

쿠타에서`A.transpose * A '를 계산할 때 문제가 있습니다.매트릭스를 계산합니다. A. 전치 * A in cuda

한다고 가정은 M의 *의 N 행렬과 열 - 전공에 저장되고, I는 CUBLAS의 행렬 매트릭스 곱셈 API 이런

되며, 펑션 cublasSgemm_v2 사용하려고 :

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 또는 다른 곳의 코드 시작 부분에서 가끔 내 프로그램이 충돌 (1/3 가능성 있음)입니다. 코드 중간에서 일부 코드를 수정하기 전에 여러 번 실행합니다. 이게 뭐야?

는 당신은 신중하게 cublas gemm documentation을 읽을 필요

+0

다른 사람이 복사, 붙여 넣기, 컴파일 및 실행하여 문제를 재현 할 수있는 최소 크기의 코드를 제공하십시오. – JackOLantern

답변

0

주셔서 감사합니다.

A' * Acublas<T>gemm으로 직접 계산하는 방법이 있지만, 까다 롭습니다.

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

조금 해킹의 일종이다 - A는 열 주요 순서와 K = N에 저장된 차원 A(MxN) 당신의 행렬이다. 응답으로 당신은 B = A' * A를 얻을 것이다.

+0

감사합니다. 그것은 작동합니다. 왜 K 대신에 N을 설정해야합니까? – Zziggurats

+0

K가 아니어야합니다. 매개 변수 사용을 표시하는 데만 사용했습니다. 물론 'N'일 수도 있습니다. – hubs