2012-06-28 5 views
-1

다음은 2 차원 배열을 2 개 추가하기 위해 작성한 코드입니다. 점점 복잡해 지지만 실행하려고 할 때 오류가 발생합니다 : 프로그램을 작성하지 못했습니다. runtime0.0000 왜 prpgram이 만들어지지 않았습니까? 또한 내가 쿼리 한 빌드 로그가 표시되지 않는 이유는 무엇입니까? 사실 배열을 초기화하는 중이므로 2 차원에서 1 차원으로의 변환은 표시되지 않고 1 차원 배열에 직접 저장되었습니다.opencl 프로그램 빌드가 실패했습니다

코드 :

# include <stdio.h> 
#include <stdlib.h> 
#ifdef APPLE 
#include<OpenCL/opencl.h> 
#else 
#include <CL/cl.h> 
#endif 
#define order 1000 
#define MAX_SOURCE_SIZE (0x100000) 
int main(int argc, char **argv) 
{ 
float *A; 
float *B; 
float *C; 
int n,m,p; 
int err; 
int szA, szB,szC; 
cl_device_id device_id; 
cl_context context; 
cl_command_queue commands; 
cl_program program; 
cl_kernel kernel; 
cl_uint nd; 
cl_mem a_in; 
cl_mem b_in; 
cl_mem c_out; 
int i,j; 
n=order; 
m=order; 
p=order; 
size_t global[2]; 
nd=1; 
cl_uint numPlatforms; 
cl_platform_id firstPlatformId; 
szA=n*p; 
szB=p*m; 
szC=n*m; 
A=(float *)malloc(sizeof(float)*szA); 
B=(float *)malloc(sizeof(float)*szB); 
C=(float *)malloc(sizeof(float)*szC); 
for(i=0; i<order; i++) 
for(j=0; j<order; j++) 
A[i*m+j]=i; 
B[i*m+j]=i; 

FILE *fp; 
char fileName[] = "./array_add_kernel.cl"; 
char *source_str; 
size_t source_size; 
fp = fopen(fileName, "r"); 
if (!fp) { 
fprintf(stderr, "Failed to load kernel.\n"); 
exit(1); 
} 
source_str = (char*)malloc(MAX_SOURCE_SIZE); 
source_size = fread(source_str, 1, MAX_SOURCE_SIZE, fp); 
fclose(fp); 
err=clGetPlatformIDs(1, &firstPlatformId, &numPlatforms); 
err=clGetDeviceIDs(firstPlatformId, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL); 
cl_context_properties conpro[]={ CL_CONTEXT_PLATFORM,(cl_context_properties) firstPlatformId, 0}; 
context=clCreateContext(conpro, 1, &device_id, NULL, NULL, &err); 
commands=clCreateCommandQueue(context, device_id,CL_QUEUE_PROFILING_ENABLE, &err); 

a_in= clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float)*szA, NULL, NULL); 
b_in= clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float)*szB, NULL, NULL); 
c_out= clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float)*szC, NULL, NULL); 
program= clCreateProgramWithSource(context, 1, (const char**)&source_str,(const size_t *)&source_size, &err); 
err= clBuildProgram(program,0, NULL, NULL, NULL, NULL); 
if(err!= CL_SUCCESS) 
{ 
size_t len; 
char buffer[2048]; 
printf("Error:Failed to build program executable!"); 
clGetProgramBuildInfo(program,device_id,CL_PROGRAM_BUILD_LOG,sizeof(buffer),buffer,&len); 
printf("%s \n",buffer); 
} 
kernel= clCreateKernel(program, "array_add_kernel", &err); 
err= 0; 
err= clSetKernelArg(kernel, 0, sizeof(int), &n); 
err|= clSetKernelArg(kernel, 1, sizeof(int), &p); 
err|= clSetKernelArg(kernel, 2, sizeof(int), &m); 
err|= clSetKernelArg(kernel, 3, sizeof(cl_mem), &a_in); 
err|= clSetKernelArg(kernel, 4, sizeof(cl_mem), &b_in); 
err|= clSetKernelArg(kernel, 5, sizeof(cl_mem), &c_out); 
err=clEnqueueWriteBuffer(commands, a_in, CL_TRUE, 0, sizeof(float)*szA, A, 0, NULL, NULL); 
err= clEnqueueWriteBuffer(commands, a_in, CL_TRUE, 0, sizeof(float)*szB, B, 0, NULL, NULL); 
cl_event prof_event; 
global[0]= (size_t)n; 
global[1]=(size_t)m; 
err=clEnqueueNDRangeKernel(commands, kernel, nd, NULL, global, NULL, 0, NULL, &prof_event); 
clFinish(commands); 
cl_ulong ev_start_time=(cl_ulong)0; 
cl_ulong ev_end_time=(cl_ulong)0; 
size_t ret_size; 
err= clGetEventProfilingInfo(prof_event, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &ev_start_time, NULL); 
err= clGetEventProfilingInfo(prof_event, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &ev_end_time, NULL); 
err=clEnqueueReadBuffer(commands,c_out,CL_TRUE,0,sizeof(float)*szC,C,0,NULL,NULL); 
cl_float runtime=(ev_end_time-ev_start_time)*1.0e-9; 
printf("Runtime:%f ",runtime); 
clReleaseProgram(program); 
clReleaseKernel(kernel); 
clReleaseMemObject(a_in); 
clReleaseMemObject(b_in); 
clReleaseMemObject(c_out); 
clReleaseCommandQueue(commands); 
clReleaseContext(context); 

} 

커널 :

kernel void array_add_kernel(
const int n, const int m, const p, _global const float * A, _global const float * B, , _global float * C) 
{ 
int i= get_global_id(0); 
int j= get_global_id(1); 
C[i*m + j] = A[i*m + j] + B[i*m + j]; 
} 
+0

모든 기능 호출의 반환 상태를 확인해야합니다. 당신이 얻은 것부터 clGetPlatformIDs와 clBuildProgram 사이에서 어디서나 실패 할 수 있습니다. –

+0

하지만 이제 다음 줄을 추가했습니다. for (i = 0; i user1456061

+0

nd는 2이어야합니다. –

답변

0

커널을 수정합니다. 그것은 오류로 가득 차 있습니다.

kernel void array_add_kernel(
const int n, 
const int m, 
const p, // No type specifier 
_global const float * A, // Should be global, not _global 
_global const float * B, , // Double comma 
_global float * C) 
    { 
    int i= get_global_id(0); 
    int j= get_global_id(1); 
    C[i*m + j] = A[i*m + j] + B[i*m + j]; 
    } 

이것은 작동 커널입니다.

kernel void array_add_kernel(const int n, const int m, global const float * A, global const float * B, global float * C) 
{ 
int i= get_global_id(0); 
int j= get_global_id(1); 
C[i*m + j] = A[i*m + j] + B[i*m + j]; 
} 
+0

ya .. 나는 커널을 고쳤다. 감사합니다 ...하지만 이제는 다음 행을 추가했습니다 : for (i = 0; i user1456061

+0

코드를 디버깅해야합니다. 커널에서 C [0] = 0, C [1] = 1 등과 같이 알고있는 것을 할당하는 것으로 시작하십시오. 그런 다음 값을 확인하고 천천히 나머지 코드를 다시 추가하십시오. – panickal

+0

고마움 .... 월요일에만 이것을 시도 할 수있을 것입니다 ... 희망을 고쳐 주길 바랍니다 ... – user1456061

관련 문제