ptxas предупреждение «double is not ready» при использовании thrust :: sort в массиве struct

0

Я пытаюсь сортировать массив структур на моем графическом процессоре с помощью thrust :: sort. Однако, когда я компилирую с nvcc, я получаю это предупреждение:

ptxas/tmp/tmpxft_00005186_00000000-5_antsim.ptx, строка 1520; предупреждение: Double не поддерживается. Демонстрация плавания

Я выделил проблему для моего вызова toust :: sort, здесь:

thrust::sort(thrustAnts, thrustAnts + NUM_ANTS, antSortByX());

thrustAnts - это массив структур Ant, расположенных на графическом процессоре, а antSortByX - функтор, как определено ниже:

typedef struct {
   float posX;
   float posY;
   float direction;
   float speed;
   u_char life;
   u_char carrying;
   curandState rngState;
} Ant;

struct antSortByX {
   __host__ __device__ bool operator()(Ant &antOne, Ant &antTwo) {
      return antOne.posX < antTwo.posX;
   }
};

Мне кажется, что в этом нет никаких удвоений, хотя я подозрительно, что оператор в моем функторе меньше, чем те, кто плавает, как удваивает. Я могу решить эту проблему, компилируя с -arch sm_13, но мне любопытно, почему это жалуется на меня в первую очередь.

  • 0
    Как вы изолировали проблему с вызовом thrust::sort() ? Мне интересно, оптимизирует ли компилятор какую-то логику DP в другом месте. Если Thrust молча увеличивает число операций с плавающей запятой до двойных, это может серьезно ухудшить производительность на графических процессорах, которые поддерживают DP, но на долю пропускной способности SP.
Теги:
cuda
thrust

1 ответ

1
Лучший ответ

Снижение происходит потому, что устройства CUDA поддерживают вычисления с двойной точностью сначала с вычислительной способностью 1.3. NVCC знает спецификации и demotes каждый двойной, чтобы плавать для устройств с CC <1.3 только потому, что аппаратное обеспечение не может обрабатывать двойные требования.

Хороший список функций можно найти в википедии: CUDA

То, что вы не видите никаких двойников в этом коде, не означает, что их там нет. Чаще всего эта ошибка возникает из-за отсутствия f postfix в константе с плавающей запятой. Производительность компилятора - это неявный литой из всех поплавков, чтобы удвоить, когда один двойной элемент является частью выражения. Константа с плавающей запятой без f является двойным значением и начинается кастинг. Тем не менее, для менее оператора оператор не должен иметь никаких постоянных выражений.

Я могу только догадываться, но мне кажется, что в вашем случае значение double precision может использоваться в реализации thrust :: sort. Поскольку вы предоставляете только функцию пользователя функции более высокого порядка (функции, которые выполняют функции в качестве параметров).

  • 1
    это не отвечает на вопрос. вопрос в том, откуда взялись двойники, а не в том, почему компилятор их понижает
  • 0
    @talonmies: ты прав, я расширил ответ
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню