2015-04-19 27 views
0

我正在将2D square matrix的矢量化表示形式传递给CUDA设备。我在网上找到了如何在CUDA设备上用这种格式的两个矩阵进行矩阵乘法。获取CUDA设备中的原始矩阵索引

但是,我现在需要在设备之前获取我的矩阵的原始索引。

这是我的代码传递给我的cuda_kernel

#define MATRIX_SIZE 20 
#define BLOCK_SIZE 2 
#define TILE_SIZE 2 

void cuda_stuff(int sz, double **A) 
{ 
    double* A1d = matrix_to_vector(sz, A); 
    double* d_A 
    size_t sizeA = sz * sz * sizeof(double); 
    cudaMalloc(&d_A, sizeA); 
    cudaMemcpy(d_A, A1d, sizeA, cudaMemcpyHostToDevice); 
    dim3 threads(BLOCK_SIZE, BLOCK_SIZE); 
    dim3 grid(MATRIX_SIZE/threads.x, MATRIX_SIZE/threads.y); 
    cudakernel<<<grid, threads>>>(sz, d_A); 
} 

这是我cudakernel

__global__ void cudakernel(int sz, double* A_d); 
{ 
    int tx = blockIdx.x * TILE_SIZE + threadIdx.x; 
    int ty = blockIdx.y * TILE_SIZE + threadIdx.y; 

    /* Need to get original i, j from my matrix double* A */ 
} 

我怎样才能得到原始指数[i] [j]我的矩阵double* A的?

回答

2

如果MATRIX_SIZE可以被BLOCK_SIZEBLOCK_SIZE必须与TILE_SIZE相同)整除,那么您的密码才能正常工作。此代码似乎设置为只处理矩形矩阵,所以我假设您的原始A矩阵的大小(MATRIX_SIZEMATRIX_SIZE)。

假设条件,下面应该获取一个对应于给定线的原始元素:

double my_A_element = A_d[ty*MATRIX_SIZE+tx]; 

,如果你愿意的话,(再次,在上述的条件),你可以使用内置变量:

double my_A_element = A_d[ty*(blockDim.x*gridDim.x)+tx]; 

或者,等同地:

double my_A_element = A_d[ty*sz+tx]; 

关于INDI ces,tx变量已正确定义,以便将原始列索引转换为A,并且ty变量已正确定义,以便为上述定义的my_A_element变量提供针对A的原始行索引。

因此的A(对应于my_A_element)原始的元素只是A[ty][tx]

+0

嗨罗伯特,感谢。你对所有的假设都是正确的,因为它们与我的矩阵一致。我知道如何从A中获得数值。我实际上希望自己得到这些指数。原因是因为我正在2D矢量化矩阵(A)和“三对角矩阵”的压缩表示之间进行矩阵乘法。我将三矩阵表示为三个阵列,每个阵列对应于对角线左侧,对角线右侧的值。这有意义吗? –

+0

也许我不明白。我在回答中添加了一些额外的评论,但我不知道他们是否解决了您的问题,因为我现在还不清楚问题的实质。 –

+0

我很欣赏这一点。我发布了一个新问题,提供了有关我整个问题的更多详细信息。 –