Прежде всего, я повторю свой комментарий: графические процессоры имеют высокую пропускную способность и большую задержку. Попытка заставить 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.
Да, он поддерживает внутренний порядок, поэтому итерация по набору, который не меняется, всегда должна быть одинаковой. Из здесь :
Внутренне элементы на карте сортируются от младшего к большему значение после определенного строгого слабого установлен критерий заказа конструкция.
std :: map
- это отсортированный контейнер, так что да, порядок гарантирован (такой же, как порядок, который вы явно или неявно используете в его конструкторе) . Не не рассчитывайте на это для популярного (хотя и не стандартного) hashmap
, хотя - во многих случаях у него очень много преимуществ по сравнению с std :: map
, но не предсказуемый порядок итерации!
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;
}
}
Будет ли карта STL дать такой же порядок с началом / концом, если он не изменился? Да. Если вы измените карту, не полагайтесь на то, что порядок останется прежним.
В том же наборе данных при той же реализации STL, да. Насколько мне известно, не гарантируется, что они будут одинаковыми для разных реализаций.