OpenCl内核中的嵌套循环

OpenCl内核中的嵌套循环,opencl,Opencl,我最近开始尝试研究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])); } } for(int i=0;i

我最近开始尝试研究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]));
    }
}
for(int i=0;i
这是我使用不同的教程到目前为止得出的结论。我的问题是,我能否以某种方式摆脱内核中的外循环。你会说,这是一个OC的实现,上面的C++代码没有更多的事情可以做,使它更有效或接近OpenCL程序应该是什么样。 此外,到目前为止,我阅读的所有教程的内核都是用常量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";
const char*随机计算=
“\uuu内核\n”
“无效随机计算(”
\u全局浮点*A\n
\u全局浮点*B\n
“\u全局浮点*C)\n”
“{\n”
“//获取工作项的索引\n”
“int index=get_global_id(0);\n”
“对于(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”;

当您想在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;
}
\uuuuu内核无效矩阵mul(\uuuu全局浮点*C,
__全球浮动*A,
__全球浮动*B,
内华达州,内华达州)
{
int tx=获取全局id(0);
int ty=获取全局id(1);
浮点数=0;
对于(int k=0;k

您是否需要对原始代码中的内部循环的用途进行完整解释?您似乎根本没有使用
j
,所以您只是执行了100次相同的表达式。是的,我正在执行100次相同的表达式。我可以在某个地方使用它,但目的是了解是否有任何方法可以在OpenCL内核中用C++的嵌套循环转换C++代码。(如何优化某个东西取决于它应该做什么:仅仅添加多余的代码来处理某个问题就会使问题变得毫无意义,因为唯一明智的优化就是摆脱它。想出
j
的用法,你就会得到有意义的答案,这取决于你决定如何使用它。)这个问题太笼统了,无法回答。因为“如何使用嵌套循环?”可以回答为“所以这个:for(::){for(::){}”。这是容易的,困难的部分是如何“有效地”使用它们,没有适当的例子就无法回答。