Function openCL辅助函数调用不工作
我正在编写一个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列的数组: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,//用于测试的虚拟输出
__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);