kernel 创建 时,返回一个错误码-46,可能的原因有哪些

解放牌 2015-12-04 04:07:12
static void mergeRegions(std::vector<int>& mergedRegions, int nRegions, int imSize, std::vector<bool>& neighbours,
std::vector<float> histColour, std::vector<float> histTexture,
std::vector<int> regionSizes, std::vector<int> rects, int similarityFlags)
{
// The indices of neighbouring regions ri and rj are stored in
// regioni and regionj with the similarity associated with the edge
// between them stored in similarities.
#if 0
std::vector<float> similarities;
std::vector<int> regioni;
std::vector<int> regionj;
#endif
#if 1
std::vector<float> similarities(nRegions*(nRegions - 1));
std::vector<int> regioni(nRegions*(nRegions - 1));
std::vector<int> regionj(nRegions*(nRegions - 1));
#endif
/* clock_t time1 = clock();
for (int i = 0; i < 5; ++i)
{
cout << "histTexture:" << neighbours[i] << endl;
}*/

#if 0
int count = 0;
for (int r = 0; r < nRegions; ++r)
{
for (int c = 0; c < r; ++c)
{
if (neighbours[c * nRegions + r])
{
similarities.push_back(similarity(r, c, nRegions, imSize, histColour,
histTexture, regionSizes, rects, similarityFlags));
regioni.push_back(r);
regionj.push_back(c);

}
count++;
}
}
/*
for (int i = 0; i < 5; ++i)
{
std::cout << "histColour:" << histColour[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "histTexture:" << histTexture[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "regionSizes:" << regionSizes[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "rects:" << rects[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "neighbours:" << neighbours[i] << endl;
}*/
cout << "count" <<count << endl;
cout << "neighbours:" << neighbours.size() << endl;
cout<<"nregions:" << nRegions*(nRegions-1)/2 << endl;
#endif
#if 1

// cout << "nRegions: " << nRegions << endl;
// Create list of similarities between regions
// using lower triangle of neighbour matrix
// int size = similarities.size();
// cout << "similarities.size()=" << similarities.size() << endl;
// cout << "regioni=" << regioni.size() << endl;
// cout << "regionj=" << regionj.size() << endl;
// cout << "neighbours=" << neighbours.size() << endl;
// cout << "histColour:" << histColour.size() << endl;
// cout << "histTexture:" << histTexture.size() << endl;
// cout << "regionSizes:" << regionSizes.size() << endl;
// cout << "rects:" << rects.size() << endl;
float * tarrayc = (float*)malloc(sizeof(float)* histColour.size());
float * tarrayt = (float*)malloc(sizeof(float)* histTexture.size());
float * tarraysi = (float*)malloc(sizeof(float)* regionSizes.size());
int * tarrayr = (int*)malloc(sizeof(int)* rects.size());
// bool * tarrayn = (bool*)malloc(sizeof(bool)* neighbours.size());
int *tarrayn = (int*)malloc(sizeof(int)* neighbours.size());

for (int i = 0; i < neighbours.size();++i)
{
tarrayn[i] = neighbours[i];
}

/* for (int i = 0; i < 5; ++i)
{
std::cout << "histColour:" << histColour[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "histTexture:" << histTexture[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "regionSizes:" << regionSizes[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "rects:" << rects[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "neighbours:" << neighbours[i] << endl;
}
*/

for (int i = 0; i < histColour.size(); ++i)
{
tarrayc[i] = histColour[i];
}
for (int i = 0; i < histTexture.size(); ++i)
{
tarrayt[i] = histTexture[i];
}
for (int i = 0; i < regionSizes.size(); ++i)
{
tarraysi[i] = regionSizes[i];
}
for (int i = 0; i < rects.size(); ++i)
{
tarrayr[i] = rects[i];
}
/* for (int i = 0; i < 5; ++i)
{
std::cout << "histColour1:" << tarrayc[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "histTexture1:" << tarrayt[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "regionSizes1:" << tarraysi[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "rects1:" << tarrayr[i] << endl;
}
for (int i = 0; i < 5; ++i)
{
std::cout << "neighbours1:" << tarrayn[i] << endl;
}*/
int count = 0;
count= (nRegions * (nRegions-1))/2;
float * tarrays = (float*) malloc(sizeof(float) * count);
memset(tarrays, 0, count * sizeof(float));
int * tarrayi = (int*) malloc(sizeof(int) * count);
memset(tarrayi, 0, count * sizeof(int));
int * tarrayj = (int*) malloc(sizeof(int) * count);
memset(tarrayj, 0, count * sizeof(int));
/* for (int i = 0; i < 5; ++i)
{
cout << "similarities:" << histColour[i] << endl;
}*/
cl_mem outputBuffers = clCreateBuffer(a.context, CL_MEM_WRITE_ONLY, count * sizeof(float), NULL, NULL);
cl_mem outputBufferi = clCreateBuffer(a.context, CL_MEM_WRITE_ONLY, count * sizeof(int), NULL, NULL);
cl_mem outputBufferj = clCreateBuffer(a.context, CL_MEM_WRITE_ONLY, count * sizeof(int), NULL, NULL);
cl_mem inputBuffer1 = clCreateBuffer(a.context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int)* count, tarrayn , NULL);
cl_mem inputBuffer2 = clCreateBuffer(a.context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)* histColour.size(), tarrayc,NULL);
cl_mem inputBuffer3 = clCreateBuffer(a.context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)* histTexture.size(), tarrayt, NULL);
cl_mem inputBuffer4 = clCreateBuffer(a.context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)* regionSizes.size(), tarraysi, NULL);
cl_mem inputBuffer5 = clCreateBuffer(a.context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int)* rects.size(), tarrayr, NULL);
int d;
cl_kernel kernel = clCreateKernel(a.program, "Similar", &d);
if (d == SUCCESS)
{
std::cout << "SUCCESS" << endl;
}
else
{
std::cout << "ERROR:" << d << endl;
}
a.status = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&outputBuffers);
a.status = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&outputBufferi);
a.status = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&outputBufferj);
a.status = clSetKernelArg(kernel, 3, sizeof(cl_mem), (void*)&nRegions);
a.status = clSetKernelArg(kernel, 4, sizeof(cl_mem), (void*)&tarrayn);
a.status = clSetKernelArg(kernel, 5, sizeof(cl_mem), (void*)&imSize);
a.status = clSetKernelArg(kernel, 6, sizeof(cl_mem), (void*)&tarrayc);
a.status = clSetKernelArg(kernel, 7, sizeof(cl_mem), (void*)&tarrayt);
a.status = clSetKernelArg(kernel, 8, sizeof(cl_mem), (void*)&tarraysi);
a.status = clSetKernelArg(kernel, 9, sizeof(cl_mem), (void*)&tarrayr);
a.status = clSetKernelArg(kernel,10, sizeof(cl_mem), (void*)&similarityFlags);

size_t global_work_size[] = { nRegions, (nRegions-1) };
a.status = clEnqueueNDRangeKernel(a.commandQueue, kernel, 2, NULL, global_work_size, NULL, 0, NULL, NULL);

//Step 11: Read the cout put back to host memory.
a.status = clEnqueueReadBuffer(a.commandQueue, outputBuffers, CL_TRUE, 0, sizeof(float)* count, tarrays, 0, NULL, NULL);
a.status = clEnqueueReadBuffer(a.commandQueue, outputBufferi, CL_TRUE, 0, sizeof(int)* count, tarrayi, 0, NULL, NULL);
a.status = clEnqueueReadBuffer(a.commandQueue, outputBufferj, CL_TRUE, 0, sizeof(int)* count, tarrayj, 0, NULL, NULL);

for (int i = 0; i < count; ++i)
{
// similarities[i] = tarrays[i];
regioni[i] = tarrayi[i];
// regionj[i] = tarrayj[i];
}
/* for (int i = 0; i < 5; ++i)
{
cout << "regioni:" << regioni[i] << endl;
}*/
a.status = clReleaseMemObject(outputBuffers);
a.status = clReleaseMemObject(outputBufferi);
a.status = clReleaseMemObject(outputBufferj);
a.status = clReleaseMemObject(inputBuffer1);
a.status = clReleaseMemObject(inputBuffer2);
a.status = clReleaseMemObject(inputBuffer3);
a.status = clReleaseMemObject(inputBuffer4);
a.status = clReleaseMemObject(inputBuffer5);

kernel 代码如下:
__kernel void Similar (___global float *tarrays,__global int * tarrayi, ___global int * tarrayj,  int nRegions,
int * neighbours, int imSize, ___global float *histColour,
___global float *histTexture, ___global float *regionSizes, __global int *rects, int Flags)
{
int idx = get_global_id(0);
int idy = get_global_id(1);
int temp;
if(idy<idx)
{
if (neighbours[idy * nRegions + idx])
{
temp = similarity(idx, idy, nRegions, imSize, histColour, histTexture, regionSizes, rects, Flags);
tarrays[idy * nRegions +idx] = 1;
tarrayi[idy * nRegions +idx] = 1;
tarrayj[idy * nRegions +idx] = 1;
}
}
}

创建设备 context等步骤之前定义了,不是那块的问题,
clCreateKernel 返回的错误是-46 , 这个函数有没有调用错误?或者之前的哪个地方错了?
这个是选择搜索算法的c实现算法中的合并区域函数的一部分,各位有什么高见?
...全文
1355 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
fronteer 2015-12-14
  • 打赏
  • 举报
回复
a.status = clSetKernelArg(kernel, 5, sizeof(cl_mem), (void*)&imSize); 应该是 a.status = clSetKernelArg(kernel, 5, sizeof(cl_int), (void*)&imSize); 吧 ? cl_int 和 cl_mem 长度不一样的。

603

社区成员

发帖
与我相关
我的任务
社区描述
异构开发技术
社区管理员
  • OpenCL和异构编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧