注意:这个问题与OpenCL本身无关......请查看最后一段,以获得我的问题的简洁陈述.但要提供一些背景知识:
我正在编写一些使用OpenCL的C++代码.我喜欢将OpenCL内核的源代码保存在自己的文件中,以保持编码和维护的简单性(而不是将源代码直接嵌入到相关C++代码中的字符串常量中).这一问题不可避免地导致了一旦分配二进制文件时如何将它们加载到OpenCL运行时的问题 - 理想情况下,OpenCL源包含在二进制文件中,因此二进制文件不需要在特定的位置在一些目录结构中,知道OpenCL源代码的位置.
我想将OpenCL文件作为字符串常量包含在某处,最好不使用额外的构建步骤或外部工具(对于交叉编译器/跨平台易用性...即,不xxd等等).我以为我偶然发现了一个基于这个帖子中第二个答案的技术,就像这样:
#define STRINGIFY(src) #src
inline const char* Kernels() {
static const char* kernels = STRINGIFY(
#include "kernels/util.cl"
#include "kernels/basic.cl"
);
return kernels;
}
Run Code Online (Sandbox Code Playgroud)
请注意,STRINGIFY如果可能的话,我宁愿不在我的OpenCL代码中嵌入宏(如上面引用的SO问题中所做的那样).现在,这在Clang/LLVM编译器上运行得非常好,但是GCC死了一个可怕的死亡("未终止的参数列表调用宏STRINGIFY"和与.cl文件的内容相关的各种语法"错误"出现).所以,很明显这个确切的技术在编译器中是不可用的(没有尝试过MSVC,但我也希望它能在那里工作)...我怎么能最低限度地按摩它以便它可以在编译器中工作?
总之,我想要一种符合标准的技术,将文件内容作为C/C++字符串常量包含在内,而无需调用外部工具或使用无关代码污染文件.想法?
编辑:正如Potatoswatter指出的那样,上面的行为是未定义的,所以一个真正的交叉编译器预处理器技术不涉及触摸要被字符串化的文件可能是不可能的(第一个找出令人发指的人)黑客工具,做的工作对大多数/所有的编译器得到的答案要点).对于好奇的,最后我做什么在第二个响应建议在这里 ......也就是说,我添加了STRINGIFY直接宏OpenCL的文件,我包括:
在somefile.cl:
STRINGIFY(
... // Lots of OpenCL code
)
Run Code Online (Sandbox Code Playgroud)
在somefile.cpp:
#define STRINGIFY(src) #src
inline const char* Kernels() {
static const char* kernels =
#include "somefile.cl"
;
return kernels;
}
Run Code Online (Sandbox Code Playgroud)
这在我尝试过的编译器中起作用(Clang和GCC也是如此,因为它在宏内部没有预处理器指令),并且至少在我的上下文中并没有太大的负担(即,它没有' t干扰语法高亮/编辑OpenCL文件).像这样的预处理器方法的一个特点是,由于相邻的字符串被连接起来,你可以写
inline const …Run Code Online (Sandbox Code Playgroud) 是否有可能强制乳胶使用斜杠符号表示分数(即用斜线分隔分子和分母而不是将它们叠加在一起)?只使用斜杠(/)而不是\ frac看起来很糟糕,因为斜杠不能正确调整大小.
我正在开发MATLAB的PsychToolbox的扩展,允许在心理物理实验期间更好地控制鼠标(具体来说,防止屏幕边界限制拖动操作......它应该感觉你可以在所有方向上"无限地"移动鼠标) .由于MATLAB不支持创建额外的线程(无论如何这对于这种情况都是不必要的复杂),我不能使用Carbon或Cocoa事件管理器.
CGGetLastMouseDelta对于我需要做的事情来说几乎是完美的(它获取了鼠标移动的数量" 自应用程序收到的最后一次鼠标移动事件 "忽略屏幕边界),但是有一个小问题.以编程方式移动鼠标(使用CGWarpMouseCursorPosition或CGDisplayMoveCursorToPoint)时,不会生成任何事件.因此,CGGetLastMouseDelta似乎并不知道鼠标已经移动了.换句话说,如果我以编程方式将鼠标移动50个像素并向下移动50个像素,则CGGetLastMouseDelta之后将返回(0,0)鼠标增量.这在我的上下文中是不受欢迎的行为,需要丑陋的变通方法.我试过通过事件系统发布事件来移动鼠标,如下所示(这是一个"mexFunction",MATLAB调用C代码的方式):
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
CGEventRef event;
CGPoint offset;
CGPoint currentLocation;
CGPoint newLocation;
if (nrhs != 2)
mexErrMsgTxt("The global x and y coordinates (and only those) must be supplied.");
event = CGEventCreate(NULL);
currentLocation = CGEventGetLocation(event);
CFRelease(event);
offset = CGPointMake((CGFloat) mxGetScalar(prhs[0]), (CGFloat) mxGetScalar(prhs[1]));
newLocation = CGPointMake(currentLocation.x + offset.x, currentLocation.y + offset.y);
event = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newLocation, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
}
Run Code Online (Sandbox Code Playgroud)
这快乐地移动了鼠标,但似乎根本没有改变CGGetLastMouseDelta的行为.有没有人知道关于CGGetLastMouseDelta返回的确切规范(何时?).关于这些东西(Quartz参考)的Apple文档通常接近无用(或者至少缺少必要的细节).
谢谢!
具有限制的积分在水平方向上占据宽度,包括其限制.换句话说,如果你有一个积分大于限值(或以上)的积分
\int\limits_{-\infty < x < c} (c - x) \ dP(x)
Run Code Online (Sandbox Code Playgroud)
在被积函数(c - x)开始之前,你在积分的左边和右边留下了大量的空间.这有时是可取的,但在我的情况下却不是这样,因为我有一大堆这样的积分都在同一个表达式中.有没有办法在积分符号旁边的整体依偎内做出任何东西,忽略极限的宽度?