STL отображается, всегда дают то же упорядочивание, когда итерация от начинает () заканчиваться ()?

Прежде всего, я повторю свой комментарий: графические процессоры имеют высокую пропускную способность и большую задержку. Попытка заставить GPU превзойти CPU для выполнения наносекундной работы (или даже миллисекунды или второй работы) полностью упускает смысл делать GPU. Ниже приведен простой код, но для того, чтобы по-настоящему оценить преимущества производительности графического процессора, вам потребуется большой размер проблемы, чтобы амортизировать затраты на запуск по сравнению с ... в противном случае это бессмысленно. Я могу обыграть Ferrari в двухфутовой гонке, просто потому, что нужно повернуть ключ, запустить двигатель и нажать педаль. Это не значит, что я быстрее, чем Ferrari.

Используйте что-то подобное в C ++:

  #define N (1024*1024)
  #define M (1000000)
  int main()
  {
     float data[N]; int count = 0;
     for(int i = 0; i < N; i++)
     {
        data[i] = 1.0f * i / N;
        for(int j = 0; j < M; j++)
        {
           data[i] = data[i] * data[i] - 0.25f;
        }
     }
     int sel;
     printf("Enter an index: ");
     scanf("%d", &sel);
     printf("data[%d] = %f\n", sel, data[sel]);
  }

Используйте что-то вроде этого в CUDA / C:

  #define N (1024*1024)
  #define M (1000000)

  __global__ void cudakernel(float *buf)
  {
     int i = threadIdx.x + blockIdx.x * blockDim.x;
     buf[i] = 1.0f * i / N;
     for(int j = 0; j < M; j++)
        buf[i] = buf[i] * buf[i] - 0.25f;
  }

  int main()
  {
     float data[N]; int count = 0;
     float *d_data;
     cudaMalloc(&d_data, N * sizeof(float));
     cudakernel<<<N/256, 256>>>(d_data);
     cudaMemcpy(data, d_data, N * sizeof(float), cudaMemcpyDeviceToHost);
     cudaFree(d_data); 

     int sel;
     printf("Enter an index: ");
     scanf("%d", &sel);
     printf("data[%d] = %f\n", sel, data[sel]);
  }

Если это не сработает, попробуйте увеличить N и M больше или изменяя 256 на 128 или 512.

8
задан Jamie Cook 11 June 2009 в 03:37
поделиться

5 ответов

Да, он поддерживает внутренний порядок, поэтому итерация по набору, который не меняется, всегда должна быть одинаковой. Из здесь :

Внутренне элементы на карте сортируются от младшего к большему значение после определенного строгого слабого установлен критерий заказа конструкция.

9
ответ дан 5 December 2019 в 12:12
поделиться

std :: map - это отсортированный контейнер, так что да, порядок гарантирован (такой же, как порядок, который вы явно или неявно используете в его конструкторе) . Не не рассчитывайте на это для популярного (хотя и не стандартного) hashmap , хотя - во многих случаях у него очень много преимуществ по сравнению с std :: map , но не предсказуемый порядок итерации!

6
ответ дан 5 December 2019 в 12:12
поделиться

std :: map - это отсортированная коллекция
и вам нужно будет определить оператор «меньше»
представьте, что m - это карта типа T:

assert(m.size() > 1);
for (std::map<T>::const_iterator i = m.begin(); i != m.end(); ++i) {
    std::map<T>::const_iterator j = i + 1;
    while ( j != m.end() ) {
        assert(*i < *j);
        ++j;
    }
}
1
ответ дан 5 December 2019 в 12:12
поделиться

Будет ли карта STL дать такой же порядок с началом / концом, если он не изменился? Да. Если вы измените карту, не полагайтесь на то, что порядок останется прежним.

0
ответ дан 5 December 2019 в 12:12
поделиться

В том же наборе данных при той же реализации STL, да. Насколько мне известно, не гарантируется, что они будут одинаковыми для разных реализаций.

-2
ответ дан 5 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: