Я пытаюсь сортировать массив структур на моем графическом процессоре с помощью 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, но мне любопытно, почему это жалуется на меня в первую очередь.
Снижение происходит потому, что устройства CUDA поддерживают вычисления с двойной точностью сначала с вычислительной способностью 1.3. NVCC знает спецификации и demotes каждый двойной, чтобы плавать для устройств с CC <1.3 только потому, что аппаратное обеспечение не может обрабатывать двойные требования.
Хороший список функций можно найти в википедии: CUDA
То, что вы не видите никаких двойников в этом коде, не означает, что их там нет. Чаще всего эта ошибка возникает из-за отсутствия f
postfix в константе с плавающей запятой. Производительность компилятора - это неявный литой из всех поплавков, чтобы удвоить, когда один двойной элемент является частью выражения. Константа с плавающей запятой без f
является двойным значением и начинается кастинг. Тем не менее, для менее оператора оператор не должен иметь никаких постоянных выражений.
Я могу только догадываться, но мне кажется, что в вашем случае значение double precision может использоваться в реализации thrust :: sort. Поскольку вы предоставляете только функцию пользователя функции более высокого порядка (функции, которые выполняют функции в качестве параметров).
thrust::sort()
? Мне интересно, оптимизирует ли компилятор какую-то логику DP в другом месте. Если Thrust молча увеличивает число операций с плавающей запятой до двойных, это может серьезно ухудшить производительность на графических процессорах, которые поддерживают DP, но на долю пропускной способности SP.