【问题标题】:Nested loops in OpenCl KernelOpenCl 内核中的嵌套循环
【发布时间】: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


【解决方案1】:

当您想在 OpenCL 内核中使用嵌套循环时,请使用此示例中的二维作为矩阵乘法。

__kernel void matrixMul(__global float* C, 
      __global float* A, 
      __global float* B, 
      int wA, int wB)
{
   int tx = get_global_id(0); 
   int ty = get_global_id(1);
   float value = 0;
   for (int k = 0; k < wA; ++k)
   {
     float elementA = A[ty * wA + k];
     float elementB = B[k * wB + tx];
     value += elementA * elementB;
   }
   C[ty * wA + tx] = value;
}

您是否需要here的完整解释

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2016-04-06
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多