Я пытаюсь создать собственный оператор сканирования в кубе. Он работает сейчас, но только для размеров массивов меньше 1024, что заставляет меня думать, что он работает только для блока. Вот мой код:определить пользовательский сканирующий оператор
#include "cub/cub.cuh"
using namespace cub;
typedef int mytype;
struct CustomMin
{
template <typename T>
__host__ __device__
CUB_RUNTIME_FUNCTION __forceinline__
mytype operator()(const T &a, const T &b) const {
return (b < a) ? b : a;
}
};
int main(int argc, char *argv[])
{
int num_items = 512;
mytype *h_in;
mytype *h_out;
CustomMin min_op;
const size_t size = num_items * sizeof(mytype);
h_in = (mytype*)malloc(size);
h_out = (mytype*)malloc(size);
mytype *d_in = NULL;
cudaMalloc(&d_in, size);
mytype *d_out = NULL;
cudaMalloc(&d_out, size);
for (int i = 0; i < num_items; i++) {
h_in[i] = i;
}
cudaMemcpy(d_in, h_in, size, cudaMemcpyHostToDevice);
void *d_temp_storage = NULL;
size_t temp_storage_bytes = 0;
DeviceScan::InclusiveScan(d_temp_storage, temp_storage_bytes, d_in, d_out, min_op, num_items);
cudaMalloc(&d_temp_storage, temp_storage_bytes);
DeviceScan::InclusiveScan(d_temp_storage, temp_storage_bytes, d_in, d_out, min_op, num_items);
cudaMemcpy(h_out, d_out, size, cudaMemcpyDeviceToHost);
printf("done!\n");
return 0;
}
Он всегда висит для больших размеров ввода.
Я не могу скомпилировать этот код. Можете ли вы включить полный код, который я могу скомпилировать, не добавляя ничего или ничего не меняя. Например, ваш 'mytype' не определен, как ваш' g_allocator'. Если вы не уверены, то скопируйте то, что вы отправили в новый файл, и попытайтесь скомпилировать это. Исправьте это, чтобы он компилировался, а затем отредактируйте его обратно в вопрос. –
Ваш предыдущий код был висит здесь: 'for (int i = 0; i
Спасибо за проверку. Я выяснил, скомпилирую ли код на TitanX с sm_35, он будет висеть, но он будет работать с sm_52. Я думаю, это проблема CUB. – Mems