作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 Haskell 和 OpenCL 编写路径跟踪器,并且在将 image2d_t 传递给我的内核以将输出写入到时遇到问题。即,调用任何 get_image_*
image2d_t 上 OpenCL 中的函数返回无意义的值(通常为 0 或 2^24-1),并且 write_imagef
什么也没做。这只发生在 GPU 上运行时——CPU 运行良好。调用clGetImageInfo
在主机上返回正确的值。 OpenCL 的 Haskell 绑定(bind)将错误代码转换为异常,因此不必忘记检查错误。 clinfo 将我的版本报告为“OpenCL 1.2 AMD-APP (1084.2)”。我应该注意到我遇到(并报告了)多个导致 OpenCL 编译器出现段错误或无法链接的错误,所以这可能是我的代码中的错误而不是错误的结果。
我这样初始化 OpenCL(希望对不了解 Haskell 的人来说应该比较容易理解):
(platform:_) <- clGetPlatformIDs
(device:_) <- clGetDeviceIDs platform CL_DEVICE_TYPE_GPU
glContext <- glXGetCurrentContext
glDisplay <- glXGetCurrentDisplay
context <- clCreateContext [CL_GL_CONTEXT_KHR glContext, CL_GLX_DISPLAY_KHR glDisplay] [device] putStrLn
queue <- clCreateCommandQueue context device []
source <- readFile "pt.cl"
program <- clCreateProgramWithSource context source
clBuildProgram program [device] "-cl-strict-aliasing"
`catch` (λe -> case (e :: CLError) of
CL_BUILD_PROGRAM_FAILURE -> putStrLn "Building OpenCL program failed:"
>> clGetProgramBuildLog program device >>= putStrLn
>> throw e
_ -> return ())
kernel <- clCreateKernel program "sample"
pCorners <- mallocArray 4
buffer <- clCreateBuffer context [CL_MEM_READ_ONLY, CL_MEM_USE_HOST_PTR] (4*sizeOf (undefined :: V.Vec4F), castPtr pCorners)
clSetKernelArgSto kernel 1 buffer
tex@(TextureObject texid) <- head <$> (genObjectNames 1)
activeTexture $= TextureUnit 0
textureBinding Texture2D $= Just tex
textureFilter Texture2D $= ((Nearest, Nothing), Nearest)
textureWrapMode Texture2D S $= (Repeated, Clamp)
textureWrapMode Texture2D T $= (Repeated, Clamp)
texImage2D Nothing NoProxy 0 RGBA′ (TextureSize2D initialWidth initialHeight) 0 (PixelData RGBA UnsignedByte nullPtr)
image <- clCreateFromGLTexture2D context [CL_MEM_READ_WRITE] gl_TEXTURE_2D 0 texid
clSetKernelArgSto kernel 2 image
clSetKernelArgSto kernel 0 position
pokeArray pCorners orientedCorners -- update the pCorners array
finish -- This is glFinish()
clEnqueueAcquireGLObjects queue [image] []
clEnqueueNDRangeKernel queue kernel [width, height] [] []
clEnqueueReleaseGLObjects queue [image] []
clFinish queue
drawElements TriangleFan 4 UnsignedInt offset0
swapBuffers
__kernel void sample(float3 position, __constant float3 corner[4], image2d_t output) {
write_imagef(output, (int2)(get_global_id(0), get_global_id(1)), (float4)(0, 0.5f, 1, 1));
}
printf
s 在那里显示
get_image_*
的结果功能,但它们已经开始导致程序挂起。
最佳答案
OpenCL 规范对此有规定 - 一个 image2d_t
对象需要访问限定符。
有两个这样的限定符:
read_only
(或 __read_only
)write_only
(或 __write_only
)read_only
,但不幸的是,这是输出图像的错误选择。
write_only
限定您的图像参数。 ,或者如果您也需要从中读取,请使用某种交换系统(或使用可以同时读取和写入的全局内存缓冲区,但这会使 CL/GL 互操作更加困难,并且你失去了采样功能......)。
关于opengl - 传递给 OpenCL 内核时 image2d_t 损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13638654/
我是一名优秀的程序员,十分优秀!