gpt4 book ai didi

macros - Julia - 宏是如何相关的(基于 OpenCL.jl 的例子

转载 作者:行者123 更新时间:2023-12-05 01:49:41 24 4
gpt4 key购买 nike

我提出了不和谐,但没有结果。可能有人可以帮助我

当您查看 OpenCL 实现代码时,您有两个宏似乎以某种(神秘的)方式相互引用,我看不出这是怎么发生的。一个宏是 @check 定义在 src/macros.jl 中,另一个是 @ocl_func 定义在 api.jl 中。@check 负责运行 clfunc => $(esc(clfunc)),但据我了解它是 @ocl_func将调用 clfunc 的宏(在 api.jl 文件中)。

我的问题是“被调用的”clfunc 是怎样的,例如这个:

@check api.clGetPlatformIDs(0, C_NULL, nplatforms) (in /platforms.jl) 

传递给@ocl_func 宏?

它是隐含的吗(因为 ocl 宏是在 api 中定义的,所以每个使用 api. 调用的函数都会激活宏,在示例中它将是:

@ocl_func(clGetPlatformIDs(0, C_NULL, nplatforms)) )

我找不到粘合这两个宏的代码。澄清这一点将帮助我理解宏的工作原理。

最佳答案

考虑宏的一个简单方法是它们是源代码生成工具。

as far as I understood it is the @ocl_func macro (in the api.jl file) that will ccall the clfunc.

如果您查看 the implementation of @ocl_func ,您会看到 ccallquote block 的一部分,它正在被返回。因此,并不是 @ocl_func 将调用 clfunc,而是 @ocl_func 生成 调用 clfunc 的源代码表达式。由宏返回的 quoted block 被 Julia 视为源代码,并像任何其他代码一样编译,在这种情况下是函数定义。

所以当 Julia sees the line :

@ocl_func(clGetPlatformIDs, CL_int,
(CL_uint, Ptr{CL_platform_id}, Ptr{CL_uint}))

这会变成一个在其中使用 ccall 的函数定义。

类似地,@check生成 执行错误检查的代码,如果不成功则抛出@check 不需要了解 @ocl_func,相反两者都只是扩展到它们返回的 quoted 代码,所以任何交互都是在这些生成的代码块之间。

My question how does the 'called' clfunc, for example this one:

@check api.clGetPlatformIDs(0, C_NULL, nplatforms) (in /platforms.jl)

is passed to the @ocl_func macro?

api.clGetPlatformIDs 的函数定义是由 @ocl_func 宏生成的,但是一旦它生成,它就可以像任何普通函数一样被调用,这就是这里发生的事情.因此,@check@ocl_func 之间没有依赖关系,这是工作所必需的。

关于macros - Julia - 宏是如何相关的(基于 OpenCL.jl 的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73765823/

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