CUBのsegmented-reduction sumプリミティブを使用しようとしています。CUBのセグメント化されていない結果が生成されない
は、ここに私のコードです:
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
の宣言とメモリを割り当てる必要がないようにコードを最適化できますか?
ありがとうございます私はそれを忘れてしまった:(あなたには等しい長さのセグメントを減らす方法がありますか?実際には、私は大きなセグメントを含む大きな配列を持っています。 d_offsets @ einpoklum –