CUDA中不同内核之间的设备变量

CUDA中不同内核之间的设备变量,cuda,gpu,Cuda,Gpu,我有一个两行的数组,我有两个内核计算每行的值。 第二个内核需要使用第一行来计算第二行。我认为这不会是一个问题,因为设备变量在整个应用程序中都是活动的,并编写了下面的代码 #define IDX(x, y, N) (x * N + y) __global__ void first_forward(int N, int K, float * alpha) { int x = blockIdx.x * BLOCK_SIZE + threadIdx.x; alpha[IDX(0, x,

我有一个两行的数组,我有两个内核计算每行的值。 第二个内核需要使用第一行来计算第二行。我认为这不会是一个问题,因为设备变量在整个应用程序中都是活动的,并编写了下面的代码

#define IDX(x, y, N) (x * N + y)

__global__ void first_forward(int N, int K, float * alpha)
{
    int x = blockIdx.x * BLOCK_SIZE + threadIdx.x;
    alpha[IDX(0, x, N)] = tex1Dfetch(text_pi,x) + tex1Dfetch(text_B,IDX(x, tex1Dfetch(text_O, 0), K)); 
}

__global__ void forward_step(float * alpha, int N, int K, int step){
    int bx = blockIdx.x;
    int tx = threadIdx.x;
    int x = bx * BLOCK_SIZE + tx;
    float sum = logf(0);

    __shared__ float salpha[BLOCK_SIZE];
    __shared__ float sB[BLOCK_SIZE];

    int i,j;
    for(i = 0; i < N; i+= BLOCK_SIZE){
        // if i + tx < N

        salpha[tx] = alpha[IDX(step-1,i + tx, N)];

        sB[tx] = tex1Dfetch(text_B, IDX(x, tex1Dfetch(text_O, step), K));


        __syncthreads();
        printf("thread %x, loop %d , indexes: %d, %d ,salpha %.4f \n", x, i, step-1, i+ tx, exp(alpha[IDX(step-1,i + tx, N)]));


        for(j = 0; j < BLOCK_SIZE; j++)
            sum = add_logs(sum, salpha[j] + tex1Dfetch(text_A, IDX(i + j, x, N)) + sB[tx]);

        __syncthreads();
    }

    alpha[IDX(step, x, N)] = sum;
    printf("thread %d, step %d result %.4f \n", x, step, sum);



}

int main(int argc, char *argv[]){

float *A, *B, *pi, *alpha, *beta, *xi, *gamm;
float *dA, *dB, *dpi, *dbeta, *dalpha, *dxi, *dgamm;

....


checkCudaErrors( cudaMalloc((void**)&dalpha, sizeof(float) * N * L));
checkCudaErrors( cudaMalloc((void**)&dbeta, sizeof(float) * N * L));

first_forward<<<dimGrid, dimBlock, 0, stream_forw>>>(N,K, dalpha);
forward_step<<<dimGrid, dimBlock, 0, stream_forw>>>(dalpha, N, K, i);

checkCudaErrors(cudaMemcpyAsync(alpha + i * N,dalpha,N * sizeof(float),cudaMemcpyDeviceToHost, stream_forw));
checkCudaErrors(cudaMemcpyAsync(alpha,dalpha,N * sizeof(float),cudaMemcpyDeviceToHost, stream_forw));
}


定义IDX(x,y,N)(x*N+y) __全局无效第一个前向(整数N,整数K,浮点*alpha) { int x=blockIdx.x*BLOCK_大小+threadIdx.x; alpha[IDX(0,x,N)]=tex1Dfetch(text_pi,x)+tex1Dfetch(text_B,IDX(x,tex1Dfetch(text_O,0,K)); } __全局无效前进步(浮点*alpha,整数N,整数K,整数步){ int bx=blockIdx.x; int tx=线程idx.x; INTX=bx*块大小+tx; 浮动总和=logf(0); __共享浮式输卵管[块大小]; __共享浮动sB[块大小]; int i,j; 对于(i=0;i
当我在第二个内核中打印dalpha的第一行值时(前进步骤),所有值都打印为1.0s。但是,当我将变量dalpha复制到主机并打印第一行值时,它们都是正确的。为什么会发生这种情况?因为我的第二个内核没有得到第一行的值,所以我所有的计算都是错误的。

我解决了这个问题。出于某种原因,每当我试图以
alpha[IDX(步骤1,I+tx,N)]
的形式在内核中访问alpha时,我都没有得到正确的结果。我将其更改为
alpha[IDX((步骤1),(I+tx),N)
],一切正常。

这与C预处理器有关,与CUDA无关