2

我正在使用cub::DeviceScanfunctiona 并且示例代码片段有一个参数temp_storage_bytes,它用于分配内存(顺便说一下,代码片段永远不会释放)。

代码片段cub::DeviceScan使用指向NULL内存的指针调用函数,该指针触发它计算函数所需的临时设备内存量,然后返回。必要的临时内存是用 分配的cudaMalloc,并且函数调用会重复指向该内存。然后释放临时内存cudaFree(或可能应该)。

我正在对不同的浮点数组进行多次设备扫描,但每个浮点数组的长度相同。

我的问题是,我可以假设它temp_storage_bytes总是相同的值吗?如果是这样,我可以为许多函数调用做一个cudaMalloc和一个。cudaFree

该示例不清楚如何确定所需的内存以及它是否可以针对给定长度的给定数组进行更改。

4

1 回答 1

2

如果您重复调用相同长度的不同数组,您可以假设您只需要一次调用即可cub::DeviceScan::InclusiveScan确定所需的临时字节数。在下面的示例中,我对相同长度的不同数组进行了多次调用,并且仅使用一次调用来确定临时大小的数量-temp_storage_bytescub::DeviceScan::InclusiveScancub::DeviceScan::InclusiveScancub::DeviceScan::InclusiveScan

// Ensure printing of CUDA runtime errors to console
#define CUB_STDERR

#include <stdio.h>
#include <algorithm> // std::generate

#include <cub/cub.cuh>   // or equivalently <cub/device/device_scan.cuh>
#include <thrust\device_vector.h>
#include <thrust\host_vector.h>

void main(void)
{

    // Declare, allocate, and initialize device pointers for input and output
    int  num_items = 7;

    thrust::device_vector<int> d_in(num_items);
    thrust::device_vector<int> d_out(num_items);

    // Determine temporary device storage requirements for inclusive prefix sum
    void     *d_temp_storage = NULL;
    size_t   temp_storage_bytes = 0;

    cub::DeviceScan::InclusiveSum(d_temp_storage, temp_storage_bytes, d_in.data(), d_out.data(), num_items);

    // Allocate temporary storage for inclusive prefix sum
    cudaMalloc(&d_temp_storage, temp_storage_bytes);

    for (int k=0; k<10; k++) {

        thrust::host_vector<int> h_in(num_items);

        thrust::host_vector<int> h_out(num_items,0);

        std::generate(h_in.begin(), h_in.end(), rand);
        d_in = h_in;

         // Run inclusive prefix sum
         cub::DeviceScan::InclusiveSum(d_temp_storage, temp_storage_bytes, d_in.data(), d_out.data(), num_items);

         int difference = 0;
         int prev = 0;
         for (int i=0; i<num_items; i++) {
              h_out[i] = prev + h_in[i];
              prev = h_out[i];
              int val = d_out[i];
              printf("%i %i %i %i\n",i,difference,h_out[i],d_out[i]);
              difference = difference + abs(h_out[i] - d_out[i]);
         }

         if (difference == 0) printf("Test passed!\n");
         else printf("A problem occurred!\n");

         h_in.shrink_to_fit();
         h_out.shrink_to_fit();

    }

    getchar();

}
于 2014-05-09T21:41:39.637 回答