为什么这个cuda程序在运行后貌似没有更新h指向的数组值?

superwavelet 2011-02-24 11:20:05
代码如下:
#include <X11/Xlib.h> // X11 library headers
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <stdio.h>

__global__ void ComputMatrix (float *g, float *h,int M)
{
int col = blockIdx.x*blockDim.x+threadIdx.x;
int row =blockIdx.y*blockDim.y+threadIdx.y;

if(col < M && row < M&&row!=0&&row!=M-1&&col!=0&&col!=M-1)
{
g[row*M+col]=0.25*(h[row*M+col-1]+h[row*M+col+1]+h[(row-1)*M+col]+h[(row+1)*M+col]);
h[row*M+col]=g[row*M+col];
}

}


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

int limit=10000;
float *h;
float *g;
float *dev_g, *dev_h;
int iBlock=100;

int N;
printf("Please input the length:\n");
scanf("%d",&N);

h = (float *)malloc(N*N * sizeof(float));
g = (float *)malloc(N*N * sizeof(float));
int X_RESN=N;/* x resolution */
int Y_RESN=N; /* y resolution */

/* --------------------------- X11 graphics setup ------------------------------ */
Window win; /* initialization for a window */
unsigned int width, height, /* window size */
win_x,win_y, /* window position */
border_width, /* border width in pixels */
display_width, display_height, /* size of screen */
screen; /* which screen */
char *window_name = "My graphics program", *display_name = NULL;
GC gc;
unsigned long valuemask = 0;
XGCValues values;
Display *display;
XSizeHints size_hints;
Pixmap bitmap;
//XPoint points[800];
FILE *fp, *fopen ();
char str[100];

XSetWindowAttributes attr[1];
if ( (display = XOpenDisplay (display_name)) == NULL ) { /* connect to Xserver */
fprintf (stderr, "drawon: cannot connect to X server %s\n",XDisplayName (display_name) );
exit (-1);
}
screen = DefaultScreen (display); /* get screen size */
display_width = DisplayWidth (display, screen);
display_height = DisplayHeight (display, screen);
width = X_RESN; /* set window size */
height = Y_RESN;
win_x = 0; win_y = 0; /* set window position */
border_width = 4; /* create opaque window */
win = XCreateSimpleWindow (display, RootWindow (display, screen),
win_x, win_y, width, height, border_width,
BlackPixel (display, screen), WhitePixel (display, screen));
size_hints.flags = USPosition|USSize;
size_hints.x = win_x;
size_hints.y = win_y;
size_hints.width = width;
size_hints.height = height;
size_hints.min_width = 300;
size_hints.min_height = 300;
XSetNormalHints (display, win, &size_hints);
XStoreName(display, win, window_name);
gc = XCreateGC (display, win, valuemask, &values); /* create graphics context */
XSetBackground (display, gc, WhitePixel (display, screen));
XSetForeground (display, gc, BlackPixel (display, screen));
XSetLineAttributes (display, gc, 1, LineSolid, CapRound, JoinRound);
attr[0].backing_store = Always;
attr[0].backing_planes = 1;
attr[0].backing_pixel = BlackPixel(display, screen);
XChangeWindowAttributes(display, win, CWBackingStore | CWBackingPlanes | CWBackingPixel, attr);
XMapWindow (display, win);
XSync(display, 0);

cudaMalloc((void**)&dev_g,N *N* sizeof(float));
cudaMalloc((void**)&dev_h,N *N* sizeof(float));
...全文
124 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
superwavelet 2011-06-18
  • 打赏
  • 举报
回复
还是没有解决,有哪位哥哥姐姐帮帮忙?谢啦
superwavelet 2011-02-25
  • 打赏
  • 举报
回复
为什么?把block和grid中block的个数弄很大还是一样,最终是h指向的数组没得到更新。
superwavelet 2011-02-24
  • 打赏
  • 举报
回复
第二部分如下:

int i=0;
int j=0;

for (i=0;i<N*N;i++)
{
h[i]=0;
g[i]=0;
}

for (i=0;i<N;i++)
{
h[i]=20;
g[i]=20;
h[N*(N-1)+i]=20;
g[N*(N-1)+i]=20;
h[i*N]=20;
g[i*N]=20;
g[i*N+N-1]=20;
h[i*N+N-1]=20;
}

for (i=N*3/10;i<(N-N*3/10+1);i++)
{
h[i]=100;
g[i]=100;
}

cudaMemcpy(dev_g, g , N*N*sizeof(float),cudaMemcpyHostToDevice);
cudaMemcpy(dev_h, h , N*N*sizeof(float),cudaMemcpyHostToDevice);

dim3 dimBlock;
dimBlock.x = iBlock;
dimBlock.y = iBlock;

dim3 dimGrid;
dimGrid.x = N / dimBlock.x;
dimGrid.y = N / dimBlock.y;

for (i=0;i<limit;i++)
{
ComputMatrix<<<dimGrid,dimBlock>>>(dev_g,dev_h,N);
if (i%100==0)
{

cudaMemcpy(h,dev_h,N*N*sizeof(float),cudaMemcpyDeviceToHost);

XClearWindow(display,win);

int iteration=0;
for (iteration=0;iteration<limit;iteration++)
{

for (i=0;i<N*N;i++)
{
if (90<h[i]&&h[i]<=100)
{
XSetForeground(display,gc,(long) 0x7F0000);
}
if (80<h[i]&&h[i]<=90)
{
XSetForeground(display,gc,(long) 0xB22222);
}
if (70<h[i]&&h[i]<=80)
{
XSetForeground(display,gc,(long) 0xDC143C);
}
if (60<h[i]&&h[i]<=70)
{
XSetForeground(display,gc,(long) 0xFF0000);
}
if (50<h[i]&&h[i]<=60)
{
XSetForeground(display,gc,(long) 0xFF6347);
}
if (40<h[i]&&h[i]<=50)
{
XSetForeground(display,gc,(long) 0xFF4500);
}
if (30<h[i]&&h[i]<=40)
{
XSetForeground(display,gc,(long) 0xFFA500);

}
if (20<h[i]&&h[i]<=30)
{
XSetForeground(display,gc,(long) 0xFFD700);
}
if (10<h[i]&&h[i]<=20)
{
XSetForeground(display,gc,(long) 0xFFFF00);
}

if (0<=h[i]&&h[i]<=10)
{
XSetForeground(display,gc,(long) 0x00FF00);
}

XDrawPoint(display,win,gc,i%N,i/N);
XFlush(display);
}
//sleep(1);
}
}
}
}

374

社区成员

发帖
与我相关
我的任务
社区描述
CUDA on Linux
社区管理员
  • CUDA on Linux社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧