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

2016-10-13 17:09
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实现算法中的合并区域函数的一部分,各位有什么高见?

回复讨论(解决方案)

   a.status = clSetKernelArg(kernel, 5, sizeof(cl_mem), (void*)&imSize);

应该是     a.status = clSetKernelArg(kernel, 5, sizeof(cl_int), (void*)&imSize);   吧 ?    cl_int 和 cl_mem 长度不一样的。