在openCL中释放内存冻结了我的电脑

时间:2014-08-21 03:19:04

标签: c++ opencl grand-central-dispatch

我有3个嵌套循环,最顶层和最内层循环是线程安全的,但中间循环不是。我基本上在大矩阵的每一列上多次操作非线性函数。我需要遍历列,然后是函数的迭代,然后是行。

我正在使用带有Xcode,Grand Central Dispatch和openCL的MacPro。我有几个选项可以做到这一点。 1)我可以使用CPU并行循环遍历列,并使用for for进行其他2个循环。 2)我可以在我的GPU上使用openCL来并行循环(使用for循环执行其他行)或3)如果我很幸运我可以使用CPU并行执行最顶层循环,并且openCL并行完成最内层的循环。我尝试了第三种选择,因为如果它起作用,它将是最快的,希望......

所以我做了

dispatch_apply(ncol,cpu_queue,^(size_t col){  // outermost column loop
    void* gpu_mem = gcl_malloc(...);          // send column to GPU
    dispatch_sync(gpu_queue,^{                // tells it to do stuff on GPU
        for (int t = 0; t < nt; t++){         // loop over iterations of function
            function_kernel(&range,...);      // openCL loop over the rows
        }
        gcl_memcpy(...);                      // send results back to CPU
    });
    dispatch_release(gpu_queue);              // release the queue
    gcl_free(gpu_mem);                        // free the gpu memory
});

此代码冻结了我的电脑,我必须按住包装盒上的电源按钮进行硬关机。我已经确定了罪魁祸首... gcl_free(gpu_mem); ...如果我发表评论,那么代码就可以了。但是整个事情实际上是在一个更大的for循环中。所以上面的代码适用于大外部循环的2或3次迭代,但是然后gpu耗尽内存,因为我没有释放它。如果我将第一个dispatch_apply更改为for循环,一切正常,我可以释放gpu内存而不会出现问题。

我认为我的计算机非常智能,可以高效地在调度并行循环内部运行openCL循环,因为这段代码(没有gcl_free)比在列上使用for循环要快得多。我的GPU有大约2000个内核,而且我使用了大约100个工作组,所以我不认为这是一个瓶颈。它只是在并行循环中释放gpu的内存时遇到了问题。

有什么建议吗?

0 个答案:

没有答案