2016-12-27 1 views
2

특정 범위에서 정수를 계산하고 결과를 변수 (GPU 당 하나의 변수)에 추가하는 커널 함수를 만들었습니다. 호스트에이 모든 것을 추가하면 적분 (이 경우 x^2dx)의 결과이며 범위 0-8에 대한 결과는 170,666 ...입니다. 이는 사실입니다. 전역 작업 크기 1, 2, 4, 8, 16, 32를 사용하고 있었지만 GWS를 64로 변경했을 때 어떤 이유로 세그먼트 화 오류가 발생했습니다. 1 개의 플랫폼 (8 개의 GPU 카드 포함) 각 장치마다 자체 큐, 컨텍스트, 커널이 있습니다.OpenCL 다중 GPU 적분 - 전역 크기를 32에서 64로 변경시 segfault

임 내가 (세 번째는 결과를 읽기위한 것입니다) 커널 나중에 전달 3 개 버퍼를 만들기 : 여기

내 코드에서 몇 줄 수 있습니다.

cl_mem bufferA[deviceNumber]; 
cl_mem bufferB[deviceNumber]; 
cl_mem bufferC[deviceNumber]; 
for(int i = 0; i< deviceNumber; i++){ 
    bufferA[i] = clCreateBuffer(context[i], CL_MEM_READ_WRITE , sizeof(float) * global_size, NULL, &error); 
    bufferB[i] = clCreateBuffer(context[i], CL_MEM_READ_ONLY , sizeof(float) * global_size, NULL, &error); 
    bufferC[i] = clCreateBuffer(context[i], CL_MEM_WRITE_ONLY, sizeof(float) * global_size, NULL, &error); 
} 

나중에 프로그램을 만들고 빌드 한 후 커널 인수를 설정합니다.

for(int i = 0; i< deviceNumber; i++){ 
     error = clSetKernelArg(kernel[i], 0, sizeof(cl_mem), (void*)&bufferA[i]); 
     error = clSetKernelArg(kernel[i], 1, sizeof(cl_mem), (void*)&bufferB[i]); 
     error = clSetKernelArg(kernel[i], 2, sizeof(cl_mem), (void*)&bufferC[i]); 
     error = clSetKernelArg(kernel[i], 3, sizeof(cl_int), (void*)&global_size); 
} 

및 대기열에 writeBuffers 자신의 업무를 수행하는 커널을 대기열에

for(int i = 0; i< deviceNumber; i++){ 
    error = clEnqueueWriteBuffer(commandQueue[i], bufferA[i], CL_FALSE, 0, sizeof(float) * global_size, a, 0, NULL, NULL); 
    error = clEnqueueWriteBuffer(commandQueue[i], bufferB[i], CL_FALSE, 0, sizeof(float) * global_size, &b[i], 0, NULL, NULL); 
} 

.

for(int i = 0; i< deviceNumber; i++){ 
    error = clEnqueueNDRangeKernel(commandQueue[i], kernel[i], 1, NULL, &global_size, &localWorkSize, 0, NULL, NULL); 
} 

와는 segfault가 발생하는 위치 마침내 장소 : 나는 모든 곳에서 오류 코드를 인쇄하고

for(int i = 0; i< deviceNumber; i++){ 
    std::cout<<"clEnqueueReadBuffer: "<<error<<std::endl; 
    error = clEnqueueReadBuffer(commandQueue[i], bufferC[i], CL_TRUE, 0, sizeof(float) * global_size, &c[i], 0, NULL, NULL); 
} 

을 거기에 모두 0 하고에 충돌 그래서 내가 출력에서 ​​볼 마지막은 clEnqueueReadBuffer 전에 해당 문자열입니다 for 루프의 첫 번째 반복.

내가 여기에 무엇을 놓치고 있는지 아는 사람이 있습니까?

+0

그건 C가 아니에요! 태그를 스팸하지 마십시오. – Olaf

답변

0

오류를 발견했습니다!

sizeof(float) * global_size 

는 당신이 장치 당 하나 개의 변수를 읽을 경우에만를 sizeof (타입) 아무것도 더 필요하지 크기가 global_size 같지이었다 벡터를 읽는하지만 나는 완전히, 그것에 대해 잊고 통합에 코드를 오므리 후 확인했다. 그것이 도움이되기를 바랍니다