这是我的代码:
int main() {
const int N = 7;
const int num_segments = 3;
int d_offsets[]= {0,3,3,7};
int *h_data = (int *)malloc(N * sizeof(int));
int *h_result = (int *)malloc(num_segments * sizeof(int));
for (int i=0; i<N; i++) {
h_data[i] = 3;
}
int *d_data;
cudaMalloc((int**)&d_data, N * sizeof(int));
cudaMemcpy(d_data, h_data, N * sizeof(int), cudaMemcpyHostToDevice);
int *d_result;
cudaMalloc((int**)&d_result, num_segments * sizeof(int));
void *d_temp_storage = NULL;
size_t temp_storage_bytes = 0;
cudaMalloc((void**)&d_temp_storage, temp_storage_bytes);
cub::DeviceSegmentedReduce::Sum(d_temp_storage, temp_storage_bytes, d_data, d_result,
num_segments, d_offsets, d_offsets + 1);
cudaMemcpy(h_result, d_result, num_segments*sizeof(int), cudaMemcpyDeviceToHost);
printf("Results:\n");
for (int i=0; i<num_segments; i++) {
printf("CUB: %d\n", h_result[i]);
}
}
但结果我得到了这个:
Results:
CUB: 0
CUB: 0
CUB: 0
我无法弄清楚到底是什么问题。在实际示例中,我有一个非常大的数组,其中段等于 400。我可以优化代码,这样我就不需要为d_offsets
.