gpt4 book ai didi

c++ - OpenCL mandlebrot 图,在 GPU 上非常嘈杂

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:28 24 4
gpt4 key购买 nike

为了尝试学习 OpenCL,我决定绘制 Mandlebrot 集的图。它似乎在 CPU 上运行良好。下面的两张图片显示了在 CPU(Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz)上执行的内核,第二张图片显示了在 GPU(HD Graphics 4000)上渲染时的图像。

这是内核:

typedef float2 Complex;

Complex complex_mul(Complex a, Complex b)
{
return (Complex)(a.s0*b.s0-a.s1*b.s1, a.s1*b.s0+a.s0*b.s1);
}

__kernel
void mandelbrot (__global float* p)
{
const int x = get_global_id (0);
const int y = get_global_id (1);
const int arrlen = PIXELS_WIDTH * PIXELS_HEIGHT;


float width = PIXELS_WIDTH;
float height = PIXELS_HEIGHT;

float whRatio = width / height;

float tx = x;
float ty = y;

float px = ((tx / float(PIXELS_WIDTH)) - 0.5) * 2.0;
float py = ((ty / float(PIXELS_HEIGHT)) - 0.5) * 2.0 / whRatio;

Complex z;
z.s0 = 0;
z.s1 = 0;
Complex c;
c.s0 = px;
c.s1 = py;


float color = 0.0;

int iterations = 500;
for (int i = 0; i < iterations; i++)
{
z = complex_mul(z,z) + c;

if ( length(z) > 2.0)
{
float u,o;
u = i;
o = iterations;
color = ( u / o );
break;
}
}


const int pId = y * PIXELS_WIDTH + x;
if ( pId < arrlen )
{
p[ pId ] = color;
}
}

还有宿主程序……至少是有趣的一点(我希望如此):

size_t globalSizes[2] = { PIXEL_WIDTH, PIXEL_HEIGHT };

cl_mem image_buffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(image_data), NULL, &error);
CheckError(error);

error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &image_buffer);
CheckError(error);

error = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, globalSizes, NULL, 0, NULL, &computeDone);
CheckError(error);

clWaitForEvents(1, &computeDone);

error = clEnqueueReadBuffer(queue, image_buffer, CL_TRUE, 0, sizeof(image_data), image_data, 0, NULL, NULL);
CheckError(error);

clReleaseMemObject(image_buffer);

我在装有 OS X 10.9.5 的 MacBook Pro 上运行它。每次执行时,集合周围的噪声部分会略有(随机)变化。

我希望我已经提供了足够的信息,如果有人对可能出现的问题提出建议,我将很高兴听到!

谢谢:)

enter image description here

enter image description here

编辑

我做了以下事情:

按照 huseyin tugrul buyukisik 在评论中的建议,将所有数字文字更改为 float 。

然后将 length(z) > 2.0 更改为 (z.s0 * z.s0) + (z.s1 * z.s1) > 4.0f

然后尝试使用迭代计数器。

看来噪音对迭代次数很敏感。

例如,1000 次迭代会产生很多噪声,而 1009 次迭代会生成非常平滑的图像。关于为什么会发生这种情况有什么建议吗?

干杯

最佳答案

有时驱动程序在驱动程序端的 vector 实现上存在错误。如果 fp64 支持或主机端元素对齐检查不起作用,则尝试“标量”版本可以简单地解决它。

例如,我的 fx-8150 cpu 在 float8 和 float16 方面存在问题,但 gpus 在任何原生 vector 方面都没有问题,在遥远的过去 fx-8150 也没有问题。也许我们被迫(无意或有意)购买新技术。

您应该尝试不同版本的驱动程序,因为有时公司会故意或无意地调整设置并损坏支持列表。

也许我错了,你的集成 GPU 快没电了。

关于c++ - OpenCL mandlebrot 图,在 GPU 上非常嘈杂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35528420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com