簡體   English   中英

在boost :: compute中分配大向量

[英]Allocating large vectors in boost::compute

在嘗試boost :: compute時,我遇到了一個問題,即確定可以在設備上分配的最大向量(我對boost :: compute還是很陌生)。 以下代碼片段

std::vector<cl_double> host_tmp;
std::cout << "CL_DEVICE_GLOBAL_MEM_SIZE / sizeof(cl_double) = " << device.get_info<cl_ulong>(CL_DEVICE_GLOBAL_MEM_SIZE) / sizeof(cl_double) << "\n";
std::cout << "CL_DEVICE_MAX_MEM_ALLOC_SIZE / sizeof(cl_double) = " << device.get_info<cl_ulong>(CL_DEVICE_MAX_MEM_ALLOC_SIZE) / sizeof(cl_double) << "\n";
size_t num_elements = device.get_info<cl_ulong>(CL_DEVICE_MAX_MEM_ALLOC_SIZE) / sizeof(cl_double);
compute::vector<cl_double> dev_tmp(context);
std::cout << "Maximum size of vector reported by .max_size() = " << dev_tmp.max_size() << "\n";
for (auto i = 0; i < 64; ++i) {
    std::cout << "Resizing device vector to " << num_elements << "...";
    dev_tmp.resize(num_elements, queue);
    std::cout << " done.";
    std::cout << " Assigning host data...";
    host_tmp.resize(num_elements);
    std::iota(host_tmp.begin(), host_tmp.end(), 0);
    std::cout << " done.";
    std::cout << " Copying data from host to device...";
    compute::copy(host_tmp.begin(), host_tmp.end(), dev_tmp.begin(), queue);
    std::cout << " done.\n";
    num_elements += 1024 * 1024;
}

CL_DEVICE_GLOBAL_MEM_SIZE / sizeof(cl_double) = 268435456
CL_DEVICE_MAX_MEM_ALLOC_SIZE / sizeof(cl_double) = 67108864
Maximum size of vector reported by .max_size() = 67108864
Resizing device vector to 67108864... done. Assigning host data... done. Copying data from host to device... done.
Resizing device vector to 68157440... done. Assigning host data... done. Copying data from host to device... done.
...
Resizing device vector to 101711872...Memory Object Allocation Failure

因此很明顯,報告的max_size()既不是硬性限制也不是強制性的。 我假設為了安全起見,我應該堅持報告的max_size(),但是,如果我在max_size()大小的設備上分配了多個向量,那么我還會收到“ Memory Object Allocation Failure消息。

  1. 使用boost :: compute處理(並避免)內存分配失敗的正確/常用方法是什么?
  2. 如何確定在任何給定時刻可以分配的向量的最大大小(即設備可能已經包含分配的數據)?
  3. 如果我有太多數據,我可以得到boost :: compute以自動分塊處理它還是我必須自己分解它?
  4. 完成操作后,如何釋放設備上的內存?
  1. 使用boost :: compute處理(並避免)內存分配失敗的正確/常用方法是什么?

您只需要遵循與OpenCL相同的規則。 Boost.Compute不添加任何新限制。 您必須記住,在許多OpenCL平台上,緩沖區分配的內存是通過惰性方式完成的,因此,即使創建大小大於CL_DEVICE_MAX_MEM_ALLOC_SIZE緩沖區成功,它也可能在以后失敗(實現定義的行為)。

  1. 如何確定在任何給定時刻可以分配的向量的最大大小(即設備可能已經包含分配的數據)?

我認為那不可能。 您始終可以創建分配器類(並將其與boost::compute::vector ),該類將在每個設備上全局跟蹤該分配器類(使用CL_DEVICE_GLOBAL_MEM_SIZE ),並在沒有足夠內存的情況下執行您想做的任何事情。 但是,您必須記住,OpenCL內存是綁定到上下文而不是設備的。

  1. 如果我有太多數據,我可以得到boost :: compute以自動分塊處理它還是我必須自己分解它?

不,您必須實現一些解決方案。 可以通過多種方式完成此操作,具體取決於您的OpenCL平台和支持的OpenCL版本。

  1. 完成操作后,如何釋放設備上的內存?

boost::compute::vector的析構函數釋放設備內存。 每個OpenCL內存對象(如緩沖區)都有其引用計數器,該計數器由Boost.Compute的類適當地增加和減少。 注意:迭代器不擁有緩沖區,因此在釋放基礎緩沖區之后(例如,在分配了該緩沖區的boost::compute::vector被破壞之后),迭代器將停止工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM