在OpenCL编译器参数中转义空间

时间:2012-11-23 14:30:10

标签: preprocessor opencl

我正在尝试将参数传递给OpenCL编译器,其中包含空格,但我无法找到如何使其正确处理空间(即不只是将它们解释为下一个参数的开头)。我的代码是这样的:

status = clBuildProgram(output_program, 1, devices, "-D OutputType=unsigned char", 0, 0);

显然,这会导致编译错误

Error in processing command line: Don't understand command line argument "char"!

是否有人知道正确的语法,以使其理解我希望将OutputType定义为unsigned char

3 个答案:

答案 0 :(得分:2)

即使这个问题已经过时,我仍然会不时地看到它。 AMD的OpenCL工具链仍然不能处理在命令行上定义的宏中的空格,而它现在似乎与NVIDIA一起工作。

简单的解决方案是用\ t \ t替换所有空格。

选项卡计为编译器的空格,但不计入预处理器的标记分隔符。

答案 1 :(得分:1)

这是命令行空间处理中的一个错误,它不是(至少在最近的NVIDIA平台上)作为标准的Unix(或至少是Windows)命令行工作。

我尝试过多次括号,包括\' \" \\" \\'和反引号`。我甚至试图逃避空间本身(-D OutputType=unsigned\ char)。这没有用,命令行字符串可能根据空格的位置简单地切换到标记,似乎没有人关心括号。

一种解决方案是读取字符串中的源代码,并在其前面加上一行:

#define OutputType unsigned char

然而,有一个更简单的解决方案。您需要在文件中包含以下宏:

#define MKTWOWORD(a,b) a b

然后你可以使用以下任何一个:

status = clBuildProgram(output_program, 1, devices,
    "-D OutputType=MKTWOWORD(unsigned,char)", 0, 0);

status = clBuildProgram(output_program, 1, devices,
    "-D OutputType=MKTWOWORD(unsigned,int)", 0, 0);

status = clBuildProgram(output_program, 1, devices,
    "-D OutputType=MKTWOWORD(signed,int)", 0, 0);

status = clBuildProgram(output_program, 1, devices,
    "-D OutputType=int", 0, 0);

优点是你只需要在命令行上进行字符串处理,而不是整个源代码。

这是一个无赖,但使用-D选项在源代码中获取MKTWOWORD宏是不可能的,因为它会导致chiken-or-egg问题。你只需要在你的内核中包含它。

答案 2 :(得分:0)

你有没有尝试用\“:

逃脱它们
status = clBuildProgram(output_program, 1, devices, "-D OutputType=\"unsigned char\"", 0, 0);