Ошибка арифметического деления Cuda для длинных длинных типов данных

У меня была странная ошибка в Cuda с целочисленным делением, используя тип данных long long. Вот сокращенная версия кода.

__global__ void Test(bool * d_test_list){

long long index = threadIdx.x + blockIdx.x*blockDim.x;
bool test = false;

if (index / 25 == 5) //Somehow not true when index == 125?
{
test = true;
}

d_test_list[index] = test;
}

После распечатки всех элементов d_test_list 125 не отображается, равно как и любое число в диапазоне [125 149], которое должно работать. Мое единственное предположение, что это как-то связано с тем, как Cuda обрабатывает целочисленные типы. Аналогичная вещь происходит с модулем, неправильные результаты, но (+, — и *) все отлично работает. Я использую 1024 потоков / блок, это будет проблемой?

Я использую Cuda v6.5 RC, но я предполагаю, что к настоящему времени у них будет целочисленное деление.

0

Решение

Догадаться. Использовано слишком много потоков в блоке. Когда я уменьшил его с 1024 до 200, это решило проблему. Я думаю, что это как-то связано с количеством регистров в ядре, а также с разделением, реализуемым программным обеспечением (если оно есть).

Обновление: предел был 896 = 2 ^ 10-2 ^ 7 для деления. Для модуля это было 768 = 2 ^ 10-2 ^ 8

1

Другие решения


По вопросам рекламы [email protected]