Intel OpenCL编译器:优化结构使用情况
Intel OpenCL Compiler: optimize struct usage
我有一个问题,即在英特尔CPU上的opencl中使用结构。我当前的内核使用以下方式使用结构访问两个缓冲区:
struct pair {
float first;
float second;
};
inline const float f(const struct pair param) {
return param.first * param.second;
}
inline const struct pair access_func(__global float const * const a, __global float const * const b, const int i) {
struct pair res = {
a[i],
b[i]
};
return res;
}
// slow
__kernel ...(__global float const * const a, __global float const * const b)
{
// ...
x = f( access_func( a, b, i ) );
// ...
}
当我以以下方式更改内核时,它运行的速度要快得多:
// fast
__kernel ...(__global float const * const a, __global float const * const b)
{
// ...
x = a[i] * b[ i ];
// ...
}
有没有办法让英特尔编译器进行此优化?NVIDIA编译器似乎能够做到这一点,因为我在GPU上看不到运行时的差异。
预先感谢!
编译器无法在数据的内存布局上执行优化,考虑到openCL设备和主机之间的缓冲区和/或OpenCL设备上的多个内核之间共享了缓冲区;最有效的布局将取决于内核中的访问模式,并且每个内核显然可以不同。
您需要明智地选择数据的内存布局;这是GPU编程中最难的部分之一。请参阅针对您目标的每个实现的OPENCL优化指南,以找出他们喜欢的内容。有时,可以通过从global
内存到local
内存,然后从本地副本进行工作来掩盖效率低下的访问模式。
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 在集合的情况下使用emplace_hint的用例是什么?
- 在没有堆的情况下用两种方法构造对象
- 如何在不中断的情况下正确使用C++中的切换用例语句中的Fallthrough
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 在这种情况下,有没有办法用单个解决方案替换两个仅在类型上不同的相似函数?
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 不能在没有对象的情况下调用成员函数,但我用对象调用函数
- 在不先显式调用析构函数的情况下,在旧对象上使用placement new是否危险
- 无法在前面有多余空格的情况下获取要打印的数组.只有第一个值会用空格打印
- 在可疑的情况下发出叮当警告:函数'foo'可以用属性"noreturn"声明吗?
- 如何在没有任何JavaScript知识的情况下用PNaCl编写C++HTML5应用程序
- 如何在不使用开关大小写的情况下用C++编写菜单驱动的程序
- 在什么情况下,运算符=应该用左值/右值重载而不是复制和交换来实现
- 在没有测试用例的情况下提升单元测试框架
- 在这种情况下,为函数赋值有什么用
- 如何在没有_setmode的情况下用C++输出unicode
- 如何在没有STL的情况下用c++中的Key创建和访问内存块
- 如何在不锁定文件的情况下用C++编写文件
- clang与gcc运行时的区别:用clang构建的c++类模板在没有复制构造函数的情况下崩溃,用复制构造函数构建的gcc