这是一个顺序的Mandelbrot集合实现。CUDA Mandelbrot集合
void mandelbrot(PGMData *I)
{
float x0,y0,x,y,xtemp;
int i,j;
int color;
int iter;
int MAX_ITER=1000;
for(i=0; i<I->height; i++)
for(j=0; j<I->width; j++)
{
x0 = (float)j/I->width*(float)3.5-(float)2.5;
y0 = (float)i/I->height*(float)2.0-(float)1.0;
x = 0;
y = 0;
iter = 0;
while((x*x-y*y <= 4) && (iter < MAX_ITER))
{
xtemp = x*x-y*y+x0;
y = 2*x*y+y0;
x = xtemp;
iter++;
}
color = (int)(iter/(float)MAX_ITER*(float)I->max_gray);
I->image[i*I->width+j] = I->max_gray-color;
}
}
我想用CUDA将其并列化,但我似乎误解了一些东西,现在我被卡住了。我试过搜索互联网,但没有什么真正的好消息。
内核:
__global__ void calc(int *pos)
{
int row= blockIdx.y * blockDim.y + threadIdx.y; // WIDTH
int col = blockIdx.x * blockDim.x + threadIdx.x; // HEIGHT
int idx = row * WIDTH + col;
if(col > WIDTH || row > HEIGHT || idx > N) return;
float x0 = (float)row/WIDTH*(float)3.5-(float)2.5;
float y0 = (float)col/HEIGHT*(float)2.0-(float)1.0;
int x = 0, y = 0, iter = 0, xtemp = 0;
while((x*x-y*y <= 4) && (iter < MAX_ITER))
{
xtemp = x*x-y*y+x0;
y = 2*x*y+y0;
x = xtemp;
iter++;
}
int color = 255 - (int)(iter/(float)MAX_ITER*(float)255);
__syncthreads();
pos[idx] = color;//color;// - color;
}
内核启动是这样的:
dim3 block_size(16, 16);
dim3 grid_size((N)/block_size.x, (int) N/block_size.y);
calc<<<grid_size,block_size>>>(d_pgmData);
这里是常量:
#define HEIGHT 512
#define WIDTH 512
#define N (HEIGHT*WIDTH)
整个GPU功能
void mandelbrotGPU(PGMData *I)
{
int *pos = (int *)malloc(HEIGHT*WIDTH*sizeof(int));
int *d_pgmData;
cudaMalloc((void **)&d_pgmData, sizeof(int)*WIDTH*HEIGHT);
cudaMemcpy(d_pgmData, pos ,HEIGHT*WIDTH*sizeof(int) ,cudaMemcpyHostToDevice);
dim3 block_size(16, 16);
dim3 grid_size((N)/block_size.x, (int) N/block_size.y);
calc<<<grid_size,block_size>>>(d_pgmData);
cudaMemcpy(pos,d_pgmData,HEIGHT*WIDTH*sizeof(int) ,cudaMemcpyDeviceToHost);
cudaFree(d_pgmData);
I->image = pos;
}
问题是:它要么返回垃圾或驱动程序崩溃。我真的很感谢一些建议,因为我很困难。
嗨,你可以发布一下你用来构建项目的命令/工具吗?我真的很感激。谢谢! – user3009269