1

当使用 clSetKernelArg(memory_object) 设置内核参数并使用 clEnqueueNDKernelRangeKernel() 多次调用内核时,您之前在 clSetKernelArg() 中为内核设置的 memory_object 是否会从主机传输到 GPU,每次调用内核?

    status = clSetKernelArg(kernel, 0, sizeof(cl_mem), &inbuf);



    size_t num_total_wi = M * N;
    size_t num_wg = num_elem/N + ((num_elem/N == 0) ? 0 : 1); 
    size_t num_iter = num_elem/(num_total_wi) + (((num_elem % (num_total_wi)) == 0) ?     0 : 1); 
    for(i = 0; i < num_iter; i++) {
            size_t global_work_size[3] = {num_total_wi, 1, 1};    
            size_t local_ws[3] = {N, 1, 1}; 
            size_t global_offset[3] = {i * num_total_wi, 0, 0}; 

            clEnqueueNDRangeKernel(queue, kernel, 1, global_offset, global_work_size, local_ws, 0, NULL, NULL);

    }
4

1 回答 1

1

内存传输由调用clEnqueueWriteBufferor启动,clEnqueueWriteImage但很可能在clEnqueueNDRangeKernel被调用时启动。数据传输后,您可以根据需要多次重复使用内存对象,如果您不再次明确说明,它将不会再次传输。

于 2013-02-17T13:16:17.870 回答