使用openCl和设备中的函数,同时使用数学函数

using function in both openCl and device while using math functions

本文关键字:函数 使用 openCl      更新时间:2023-10-16

假设我有如下代码:

//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来获得这些数学函数,这不会是一个问题,但目前我不知道该怎么办。

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

例如:

#ifndef __OPENCL_C_VERSION__
  #include <cmath>
#endif

如果在主机上编译,那么您只需要添加要包含的条件语句。#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

相关文章: