有关变量从主函数传递到KERNEL函数发生错误,是什么原因呢?具体看下面的例子吧,抽象来说很难描述清楚。我在kernel中打印传递的变量的值的时候出现了错误。
#include “stdafx.h”
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#define XROW 600
#define XCOL 100
#define Mrand 10
int main(void)
{
double s0=0.1;
double V=(double)malloc(XROWXROWsizeof(double));
int XMatrix=(int)malloc(XROWXCOLsizeof(int));
double VK=(double)malloc(XCOLsizeof(double));
for(int i=0;i<XCOL;i++)
{
VK[i]=0.5;
}
for(int i=0;i<XROWXCOL;i++)
{
XMatrix[i]=1+rand()%Mrand;
}
for(int i=0;i<XROWXROW;i++)
{
V[i]=0.0;
}
clock_t t1,t2;
t1=clock();
for(int j=0;j<XCOL;j++)
{
for(int i=0;i<XROW;i++)
{
for(int k=0;k<XROW;k++)
{
V[i*XROW+k]=V[i*XROW+k]+XMatrix[i*XCOL+j]XMatrix[kXCOL+j](VK[j]-s0);
}
}
}
t2=clock();
for (int i=0;i<10;i++)
{
for(int j=0;j<6;j++)
{
printf("%f ",V[6i+j]);
}
printf(“\n”);
}
printf(“CPU所用的时间为:%d毫秒\n”,(t2-t1));
free(V);
free(XMatrix);
free(VK);
}
我将其中可以加速的部分写成并行的,如下:
global void KernelV11(double dev_V,double dev_VK,int dev_XMatrix,int j,double s0)
{
int tid=threadIdx.x;
int bid=blockIdx.x;
int xIndex=bidblockDim.x+tid;
printf(“%d\n”,j);
if(xIndex<XROW)
{
if(xIndex==0)
{
dev_V[xIndex]=dev_V[xIndex]+dev_XMatrix[j]dev_XMatrix[xIndexXCOL+j](dev_VK[j]-s0);
__syncthreads();
}
else
{
dev_V[xIndex]=dev_V[xIndex]+dev_XMatrix[j]dev_XMatrix[xIndexXCOL+j](dev_VK[j]-s0);
__syncthreads();
dev_V[xIndexXROW]=dev_V[xIndexXROW]+dev_XMatrix[j]dev_XMatrix[xIndexXCOL+j](dev_VK[j]-s0);
__syncthreads();
}
}
__syncthreads();
}
int main(void)
{
clock_t t1,t2;
double V=(double)malloc(XROWXROWsizeof(double));
int XMatrix=(int)malloc(XROWXCOLsizeof(int));
double VK=(double)malloc(XCOLsizeof(double));
for(int i=0;i<XCOL;i++)
{
VK[i]=0.5;
}
for(int i=0;i<XROWXCOL;i++)
{
XMatrix[i]=1+rand()%Mrand;
}
for(int i=0;i<XROWXROW;i++)
{
V[i]=0.0;
}
double s0=0.1;
double dev_V,dev_VK;
int dev_XMatrix;
cudaMalloc((void)&dev_V,XROWXROWsizeof(double));
cudaMalloc((void**)&dev_XMatrix,XROWXCOLsizeof(int));
cudaMalloc((void**)&dev_VK,XCOLsizeof(double));
t1=clock();
cudaMemcpy(dev_V,V,XROWXROWsizeof(double),cudaMemcpyHostToDevice);
cudaMemcpy(dev_VK,VK,XCOLsizeof(double),cudaMemcpyHostToDevice);
cudaMemcpy(dev_XMatrix,XMatrix,XROWXCOLsizeof(int),cudaMemcpyHostToDevice);
for(int j=0;j<XCOL;j++)
{
KernelV11<<<50,300>>>(dev_V,dev_VK,dev_XMatrix,j,s0);
}
cudaMemcpy(V,dev_V,XROWXROWsizeof(double),cudaMemcpyDeviceToHost);
t2=clock();
for (int i=0;i<10;i++)
{
for(int j=0;j<6;j++)
{
printf(“%f “,V[6*i+j]);
}
printf(”\n”);
}
printf(“GPU所用的时间为:%d毫秒\n”,(t2-t1));
cudaFree(dev_V);
cudaFree(dev_VK);
cudaFree(dev_XMatrix);
free(V);
free(XMatrix);
free(VK);
}
但是在kernel中printf(“%d\n”,j);的值全部为99,我认为正确的结果应该是j从0到99才对呀!难道是因为j是变量,要cudaMalloc一下吗?这种情况是不是用zero-copy好一些呢?