【发布时间】:2014-06-11 07:40:54
【问题描述】:
我最近开始尝试研究 OpenCl,并试图将以下代码转换为高效的 OpenCl 内核:
for(int i = 0; i < VECTOR_SIZE; i++)
{
for(int j = 0; j < 100; j++)
{
C[i] = sqrt(A[i] + sqrt(A[i] * B[i])) * sqrt(A[i] + sqrt(A[i] * B[i]));
}
}
这是迄今为止我使用不同的教程得出的结论。我的问题是,我能否以某种方式摆脱内核中的外循环。您是否会说这是上述 C++ 代码的一个不错的实现,并且无法做进一步的事情来使其更高效或接近 openCL 程序应该是什么样的。
此外,到目前为止,我阅读的所有教程都使用 const char * 编写内核。这背后的原因是什么,这是编写 OPenCL 内核的唯一方式,或者通常我们将它们编码在其他文件中,然后将其包含在我们的常规代码或其他东西中。
谢谢
const char *RandomComputation =
"__kernel \n"
"void RandomComputation( "
" __global float *A, \n"
" __global float *B, \n"
" __global float *C) \n"
"{ \n"
" //Get the index of the work-item \n"
" int index = get_global_id(0); \n"
" for (int j = 0; j < 100 ; j++) \n"
" { \n"
" C[index] = sqrt(A[index] + sqrt(A[index] * B[index])) * sqrt(A[index] + sqrt(A[index] * B[index])); \n"
"} \n"
"} \n";
【问题讨论】:
-
原始代码中内循环的目的是什么?你似乎根本没有使用
j,所以你只是在执行相同的表达式100次。 -
是的,我正在做同样的表达 100 次。我可以在某个地方使用它,但目标是了解是否有任何方法可以在 OpenCL 内核中使用嵌套循环转换 c++ 代码。
-
当然有 - 摆脱你不使用的循环。 (如何优化某些东西取决于它应该做什么:只是添加冗余代码以使问题变得毫无意义,因为唯一明智的优化就是摆脱它。想出一个 use i> 对于
j,你会得到有意义的答案,这取决于你决定如何使用它。) -
这个问题太笼统,无法回答。自从“如何使用嵌套循环?”可以这样回答“所以这个:for(::){for(::){}}”。这很容易,困难的部分是如何“有效地”使用它们,没有适当的例子就无法回答。
标签: opencl