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无关