2014-02-21 66 views
0

我想使用cuda 6進行布爾乘法運算,但我無法以正確的方式進行。 B是一個布爾對稱矩陣,我必須做B^n布爾乘法。布爾乘法

我的C++代碼:

for (m=0; m<dimension; m++) { 
    for (n=0; n<dimension; n++) { 
     for (k=0; k<dimension; k++) { 
      temp=mat[m*dimension+k] && mat[k*dimension+n]; 
      B[m*dimension+n]= B[m*dimension+n] || temp; 
     } 
    } 
} 

我發現了一段代碼,但我不能使其適用於我的情況。

__global__ void gpuMM(float *A, float *B, float *C, int N) 
{ 
    int row = blockIdx.y*blockDim.y + threadIdx.y; 
    int col = blockIdx.x*blockDim.x + threadIdx.x; 

    float sum = 0.f; 
    for (int n = 0; n < N; ++n) 
     sum += A[row*N+n]*B[n*N+col]; 

    C[row*N+col] = sum; 
} 
+1

雖然它不會是一個有效的matrixMul,但它是直截了當的。將代碼的最內層循環代替內核中的循環。用'temp','m','n'和'dimension'替換'sum','row','col'和'N'。 – ahmad

+0

你在做什麼是常規乘法'B = A *轉置(A)'。 '&'等同於'*',而'||'等同於'+'。只需使用Cublas來乘以這兩個矩陣。如果A是布爾型,則首先轉換爲浮點型。 –

回答

0

在代碼的第一部分爲內核使用符號時,會得到它。

for (row=0; row<N; row++) { 
    for (col=0; col<N; col++) { 
     for (n=0; n<N; n++) { 
      temp=mat[row*N+n] && mat[n*N+col]; 
      B[row*N+col] = B[row*N+col] || temp; 
     }  
    } 
} 

所以你的內核應該是這樣的:

__global__ void gpu_booleanMM(char *mat, char *B, int N) 
{ 
    int row = blockIdx.y*blockDim.y + threadIdx.y; 
    int col = blockIdx.x*blockDim.x + threadIdx.x; 

    for (int n=0; n<N; n++) { 
     temp=mat[row*N+n] && mat[n*N+col]; 
     B[row*N+col] = B[row*N+col] || temp; 
    } 
} 

我懷疑這是非常有效的,但這樣的事情還是應該給予正確的結果。