使用openCl和设备中的函数,同时使用数学函数
using function in both openCl and device while using math functions
假设我有如下代码:
//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
相关文章:
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 模板,函数使用错误的构造函数来复制我的对象
- 函数不接受 X 参数,函数使用默认参数
- 在模板函数中推导模板函数(使用C++概念)
- 静态成员函数使用相同的名称时出现模板类型名称错误
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 带有自动参数的函数使用 GCC 编译,但不使用 Visual C++ 编译
- 为什么 memcpy() 和其他类似的函数使用汇编?
- 如何释放 googletest ASSERT_THROW语句中的函数使用的资源?
- 有条件地将默认参数传递给函数(使用"?"运算符)
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- C++类析构函数使用新值而不是实际值
- lambda 函数使用其参数作为模板参数调用模板函数
- 创建一个函数,该函数使用模板创建类或子类的对象
- 如果函数使用 OPENCV Mat 作为输入,如何编写头文件?
- std::value templated 方法的函数使用 clang 和 g++ 进行编译,但不使用 msvc 进行编译
- 为什么 STL 函数使用节点的颜色来计算 std::map 节点前身
- 如何选择waveIn/waveOut函数C++使用的输入/输出设备