分段错误计数排序C ++ 11 OpenMP

时间:2016-08-10 00:45:47

标签: c++ c++11 openmp

我需要这种并行计数排序的帮助。我遇到了分段错误。 Gdb说分段错误的来源就在这一行:c [i] = 0; 什么可能出错,以及如何解决它?感谢。

void radix_sort::sort_array(int array[], int n)
{       
    std::hash<int> hash;

    std::size_t m = n / nthreads;
    std::vector <int> a(n);
    a.insert(a.end(), &array[0], &array[n]);

    std::vector<int>::iterator begin = a.begin();
    std::vector<int>::iterator end = a.end();

    int max = *std::max_element(a.begin(), a.end());
    //int min = *std::min_element(a.begin(), a.end());
    //int x = max - min + 1;
    int *split_positions = new int [nthreads+1];

    for(std::size_t i=0; i<a.size(); i=i+m){

        if(a.begin()+i+m <= a.end()){
            split_positions[i] = *a.begin()+i;
            split_positions[i+1] = *a.begin()+i+m;
        }
        else {
            split_positions[i] = *a.begin()+i;
            split_positions[i+1] = *a.end();
        }
    }               

    // create one counter array for each thread
    int **thread_counters = new int* [nthreads];
    for (int i = 0; i < nthreads; i++)
        thread_counters[i] = new int[m];

    // count occurences
    #pragma omp parallel num_threads(_nthreads)
    {
        int thread_id = omp_get_thread_num();
        int *&c = thread_counters[thread_id];

        // reset counters
        for (int i = 0; i <= max; i++)
            c[i] = 0;

        // count occurences
        for (int i = split_positions[thread_id]; i < split_positions[thread_id + 1]; i++)
        {
            c[hash(begin[i])]++;
        }
    }

    // Compute global prefix sums / ranks from local ones. We *could*
    // make this parallel, too, but there are only num_threads * (max_key + 1)
    // entries in total.
    for (int i = 0, sum = 0; i <= max; i++)
        {
            for (int j = 0; j < nthreads; j++)
                {
                    int t = thread_counters[j][i];
                    thread_counters[j][i] = sum;
                    sum += t;
                }
        }

    int *buffer = new int[n]; // backbuffer, copied back to input later

    // write sorted result to backbuffer
    #pragma omp parallel num_threads(_nthreads)
    {
        int thread_id = omp_get_thread_num();
        int *&c = thread_counters[thread_id];

        for (int i = split_positions[thread_id]; i < split_positions[thread_id + 1]; i++)
            {
                buffer[c[hash(begin[i])]++] = begin[i];
            }
    }   

    // write result from buffer back into input
    std::copy(buffer, buffer + n, array);

    // cleanup
    delete [] buffer;
    for (int i = 0; i < nthreads; i++)
        delete [] thread_counters[i];
    delete [] thread_counters;
    delete [] split_positions;

}

0 个答案:

没有答案