У меня была странная ошибка в 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, но я предполагаю, что к настоящему времени у них будет целочисленное деление.
Догадаться. Использовано слишком много потоков в блоке. Когда я уменьшил его с 1024 до 200, это решило проблему. Я думаю, что это как-то связано с количеством регистров в ядре, а также с разделением, реализуемым программным обеспечением (если оно есть).
Обновление: предел был 896 = 2 ^ 10-2 ^ 7 для деления. Для модуля это было 768 = 2 ^ 10-2 ^ 8