Function openCL辅助函数调用不工作

Function openCL辅助函数调用不工作,function,kernel,opencl,gpu,amd-processor,Function,Kernel,Opencl,Gpu,Amd Processor,我正在编写一个openCL内核来为益智游戏执行基于蛮力的AI,但是我的内核代码和/或它调用的辅助函数有问题。这是我的内核代码(我确信输入在这里正确传递):60是由ClenqueueEndRangeKernel设置的全局工作大小 内核的输入如下: __全局字符*输入//用于测试的虚拟输入 __global char*board_in,//包含60个板的大型字符数组 __global int*lookup,//一个数组,用于快速获取得分移动的分数 输出: __全局字符*out,//用于测试的虚拟输出

我正在编写一个openCL内核来为益智游戏执行基于蛮力的AI,但是我的内核代码和/或它调用的辅助函数有问题。这是我的内核代码(我确信输入在这里正确传递):60是由ClenqueueEndRangeKernel设置的全局工作大小

内核的输入如下:

__全局字符*输入//用于测试的虚拟输入

__global char*board_in,//包含60个板的大型字符数组

__global int*lookup,//一个数组,用于快速获取得分移动的分数

输出:

__全局字符*out,//用于测试的虚拟输出

__全局int*score\u out,//一个60个分数的数组:每个板一个分数

__global int*row\u out,//一个60行的数组:每个评估的板一行

__全局整数*列输出//一个60列的数组:

__kernel void helloworld(__global char* in,
                    __global char* board_in,
                    __global int* lookup,
                    __global char* out, 
                    __global int * score_out,
                    __global int * row_out,
                    __global int * col_out)
{

    int num = get_global_id(0);
    char workingBoard[72];
    int scoreMat[64];
//set up the array for each thread to use
    for(int k=0; k< 72; k++)
    {
        workingBoard[k] = board_in[num*BOARDSIZE+k];
    }
// Make a copy of the score matrix for each thread to use
    for(int j=0; j<64; j++)
    {
        scoreMat[j] = lookup[j];
    }
    int s=0;
    int r=0;
    int c=0;
    findBestMove(workingBoard,scoreMat,&s,1,&r,&c);
    col_out[num] = ?????????
    score_out[num] = ???????????
    row_out[num] = ???????????????
}
\uuuu内核无效helloworld(\uuu全局字符*in,
__全局字符*board_in,
__全局整数*查找,
__全局字符*输出,
__全局整数*分数,
__全局整数*行输出,
__全局整数*列输出)
{
int num=获取全局id(0);
字符工作板[72];
int scoreMat[64];
//为要使用的每个线程设置数组
对于(int k=0;k<72;k++)
{
工作板[k]=板[num*BOARDSIZE+k]中的板;
}
//为每个线程制作一份分数矩阵副本以供使用

对于(int j=0;j根据您的评论,问题似乎出在findBestMove函数的某个地方。顺便说一句,如果您有一个无限循环,看门狗会在某一点触发,很可能您的驱动程序会崩溃,导致黑屏或冻结

因此,我建议您对函数中的所有代码进行注释,只需为r、s、c变量指定一个选定的值,如使用get_global_id函数处理这些特定变量的workitem id。当然,将???替换为:

  col_out[num] = c;
  score_out[num] = s;
  row_out[num] = r;
如果得到正确的值,开始调试函数,您将确定问题出在函数中

由于您要求提供一些技巧,我认为有一个技巧可以提高性能(一旦您修复了错误:):使用本地内存代替scoreMat数组的私有内存。这样做可以避免让每个线程反复访问全局内存中的相同数据(这很慢)。要将数据从全局内存提取到本地内存,可以使用函数

所以在你的情况下,你会有这样的东西:

local int scoreMat[64];
event_t ev = async_work_group_copy(lookup, scoreMat, 64, 0); 
// Wait to make sure everything is copied   
wait_group_events (1, &ev);
考虑到您现在使用的是本地内存,您可能需要更改更多的代码。基本上,它的工作方式与全局内存相同(从访问角度来看),但速度要快得多


请注意,与您所拥有的不同之处在于,仅制作一份副本,而不是60份(工作项的数量)。这一次,您从全局获取的数据可以从一个工作组中的所有工作项访问。在每个工作项都有自己的副本之前。同样重要的是要强调一个事实,即在一个工作组中。但是,由于您只使用60个工作项,您很可能只有一个工作组。

d您还发布了函数“findBestMove”的代码?它加上它使用的其他函数大约有500行。这可能会有帮助,但我不确定在这里粘贴这么多代码是否有用。好的,那么“我没有通过函数调用”是什么意思?您是否有返回的错误?如果是,错误号是多少?如果不是,会发生什么?这意味着如果我注释掉函数调用,我会得到输出。如果我不注释掉它,我不会得到输出(类似于如果我有一个无限循环,但我很确定没有),不会返回错误。
local int scoreMat[64];
event_t ev = async_work_group_copy(lookup, scoreMat, 64, 0); 
// Wait to make sure everything is copied   
wait_group_events (1, &ev);