【问题标题】:using function in both openCl and device while using math functions在使用数学函数时在 openCl 和设备中使用函数
【发布时间】:2014-10-06 04:20:27
【问题描述】:

假设我有如下代码:

//MyFile.h 
void MyFunction;

//MyFile.cpp
#include "MyFile.h"

void MyFunction()
{
    float foo = sqrtf(85.3);
} 

现在,我使用的实际函数更复杂,但重点是它们使用了 sqrtf()、sin() 等函数。

我想在主机和内核中都使用这个函数,但我不想定义它两次,因为这似乎是一种不好的做法。现在我尝试使用方法 clCreateProgramWithSource() 将“MyFile.h”传递到我的 cl_program。

如果我在设备上按原样运行它,它会正常工作,因为 openCL 内置了数学函数。但是,如果我希望它在主机上运行,​​我需要包含 cmath 或其他库来定义 sqrt、sin 等。但是如果我包含 cmath 以便它在主机上运行,​​它将不再能够在设备上运行,因为 openCL 不能包含/导入 cmath。

所以我似乎无法找到一种方法来定义它一次并在两个地方使用它。如果主机不依赖 cmath 来获取这些数学函数,那将不是问题,但目前我不知道该怎么做。

【问题讨论】:

    标签: c++ math include opencl gpu


    【解决方案1】:

    您可以测试是否存在(或不存在)特定于 OpenCL C 的预处理器宏,以选择性地包含仅限主机的头文件。

    例如:

    #ifndef __OPENCL_C_VERSION__
      #include <cmath>
    #endif
    

    【讨论】:

    • 这太棒了!我不知道你能做到这一点,谢谢!
    【解决方案2】:

    如果这是在主机上编译的,那么您只需要添加条件语句以包含它。 #ifdef/#ifndef 预处理器宏将检查定义是否存在并根据此测试采取措施

    #ifndef __OPENCL_C_VERSION__
    
    // I am host, so include <cmath>
      #include <cmath>
    
    #else
    
    // I am device
    // ...
    
    #endif
    

    https://gcc.gnu.org/onlinedocs/cpp/Ifdef.html

    【讨论】:

    • 谢谢!我不知道这样的事情是一种选择。
    猜你喜欢
    • 2015-11-06
    • 1970-01-01
    • 2013-08-29
    • 2022-10-23
    • 2012-02-26
    • 2014-03-28
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多