Matrix 反对角矩阵并行

Matrix 反对角矩阵并行,matrix,parallel-processing,cuda,gpu,Matrix,Parallel Processing,Cuda,Gpu,如何交叉矩阵的反对角线,同时计算反对角线元素 如何在CUDA中循环反对角线的元素?如果您指的是如何循环从左下角到右上角的最大对角线,一种方法是将反对角线变成数组。因为,您可能希望在GPU内部的这个对角线下进行一些计算,在将数据从CPU复制到GPU之前,您可以执行以下操作: double diagonal [N]; for(int i = N - 1, j = 0; i >= 0, j < N ; i--, j++) diagonal = matrix[i][j];

如何交叉矩阵的反对角线,同时计算反对角线元素


如何在CUDA中循环反对角线的元素?

如果您指的是如何循环从左下角到右上角的最大对角线,一种方法是将反对角线变成数组。因为,您可能希望在GPU内部的这个对角线下进行一些计算,在将数据从CPU复制到GPU之前,您可以执行以下操作:

double diagonal [N];

for(int i = N - 1, j = 0; i >= 0, j < N ; i--, j++)
       diagonal = matrix[i][j];
__global__ gpuKernell(double **matrix, int N)
{
 int thread_id = blockIdx.x * blockDim.x + threadIdx.x;

    while(thread_id < N)
    {
       matrix[N-1-thread_id][thread_id] = // do something
       thread_id += blockDim.x * gridDim.x; 
    }
} 
双对角线[N];
对于(inti=N-1,j=0;i>=0,j
然后,您只需将大小为N的数组对角线(在一个大小为N^2的矩阵中)发送到GPU,而不是整个矩阵

如果要将整个矩阵发送到gpu,只需在gpu内部的反对角线上执行操作,可以执行以下操作:

double diagonal [N];

for(int i = N - 1, j = 0; i >= 0, j < N ; i--, j++)
       diagonal = matrix[i][j];
__global__ gpuKernell(double **matrix, int N)
{
 int thread_id = blockIdx.x * blockDim.x + threadIdx.x;

    while(thread_id < N)
    {
       matrix[N-1-thread_id][thread_id] = // do something
       thread_id += blockDim.x * gridDim.x; 
    }
} 
\uuuuu全局\uuuuuugpukernell(双**矩阵,整数N)
{
int thread_id=blockIdx.x*blockDim.x+threadIdx.x;
while(线程id