2017-06-23 5 views
0

Mon code se casse lorsque j'essaie de boucler les données dans la fonction noyau, après quelques itérations, il cesse de fonctionner, ne donnant que 0 comme réponse, quelqu'un sait pourquoi? Si je boucle toute méthode qui appelle le noyau fonctionne, mais il est beaucoup plus lentOpenCL arrête de s'exécuter uniquement lors d'un appel en boucle

cl_mem *ptrInput = &Pressure_BUFF; 
cl_mem *ptrOutput = &Pressure_OUT_BUFF; 

for(int i = 0; i<Interaction_per_frame; i++){ 

    clSetKernelArg(kernel_2, 4, sizeof(Pressure_BUFF), ptrInput); 
    clEnqueueNDRangeKernel(queue_2, kernel_2, 1, NULL,&work_units_per_kernel, NULL, 0, NULL, NULL); 
    clFinish(queue_2);//Terminar de calcular 

    cl_mem *ptrTpm = ptrInput; 
    ptrInput = ptrOutput; 
    ptrOutput = ptrTpm; 

} 

clEnqueueReadBuffer(queue_2, Pressure_OUT_BUFF, CL_TRUE, 0,sizeof(Pressure), Pressure, 0, NULL, NULL); 
+0

Utilisez 'clEnqueueCopyBuffer' à la place de cl_mem juggling. – anil

Répondre

0

Vous ne pouvez pas simplement changer la mémoire tampon d'entrée en laissant la sortie intacte. Sinon, les données ont la même entrée que la sortie.

La manière la plus simple de le faire est de 2 noyaux, donc vous n'avez pas besoin d'appeler setargs et de finir à chaque fois.

//Create 2 buffers, A and B 
bufA = clCreateBuffer(...); 
bufB = clCreateBuffer(...); 

//Create 2 kernels with same parameters 
kernelAB = clCreateKernel(...); 
kernelBA = clCreateKernel(...); 

//Set one to input A output B, and the other in reverse 
clSetKernelArgs(kernelAB, in, bufferA); 
clSetKernelArgs(kernelAB, out, bufferB); 
clSetKernelArgs(kernelBA, in, bufferB); 
clSetKernelArgs(kernelBA, out, bufferA); 

for(int i = 0; i<Interaction_per_frame; i++){ 
    clEnqueueNDRangeKernel(queue_2, i%2 ? kernelBA : kernelAB, 1, NULL,&work_units_per_kernel, NULL, 0, NULL, NULL);  
} 

clEnqueueReadBuffer(queue_2, Interaction_per_frame%2 ? bufferB : bufferA, CL_TRUE, 0,sizeof(Pressure), Pressure, 0, NULL, NULL);