CUDA cub::DeviceScan и параметр temp_storage_bytes
Я использую cub::DeviceScan
Функция и фрагмент кода примера имеет параметр temp_storage_bytes
, который он использует для выделения памяти (который, между прочим, фрагмент кода никогда не освобождает).
Фрагменты кода cub::DeviceScan
функции с указателем на NULL
память, которая запускает его для вычисления необходимого объема временной памяти устройства, необходимой для функции, а затем возвращает. Необходимая временная память выделяется cudaMalloc
и вызов функции повторяется, указывая на эту память. Затем временная память освобождается cudaFree
(или, вероятно, должно быть).
Я делаю много повторений сканирования устройства на разных массивах с плавающей точкой, но каждый массив с плавающей точкой имеет одинаковую длину.
Мой вопрос, могу ли я предположить, что temp_storage_bytes
всегда будет одинаковое значение? Если так, то я могу сделать один cudaMalloc
и один cudaFree
для многих вызовов функций.
В примере неясно, как определяется требуемая память и может ли она измениться для данного массива заданной длины.
1 ответ
Вы можете предположить, что вам нужен только один звонок cub::DeviceScan::InclusiveScan
определить сумму временного temp_storage_bytes
требуется байт, если вы неоднократно звонили cub::DeviceScan::InclusiveScan
по разным массивам одинаковой длины. В приведенном ниже примере я звоню несколько раз cub::DeviceScan::InclusiveScan
по разным массивам одинаковой длины и используя только один вызов cub::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();
}