2012-05-31 3 views
0

Я использую программное обеспечение OpenCL для Nvidia на графической карте GTX550ti и сталкиваюсь с непонятной проблемой. (Я новичок в OpenCL).Почему мертвый код в ядре OpenCL влияет на Nvidia GTX550ti?

Мой код ядра, как это:

__kernel void kernel_name(...) 
{ 
size_t d = get_local_id(0); 
char abc[8]; 
... 
} 

На самом деле, char abc[8] бесполезно (мертвый код) для моего случая. Но, если у меня есть char abc[8] в моем коде ядра, результат будет полностью беспорядочным, а время работы ядра будет намного длиннее (2095712 нс). Если я прокомментирую char abc[8], результат станет правильным, а время работы ядра станет короче (697856 нс). Компилятор ядра не уничтожит мертвый код?

Вышеприведенное является просто явным примером, который я могу повторить. Я также сталкиваюсь с более странным случаем, когда одна программа получает разные результаты при запуске в разное время в полностью той же среде.

Это связано с распределением памяти или ..? Кто-нибудь может дать мне несколько советов о том, как найти проблему?

Кстати, вывод информации oclDeviceQuery перечислен следующим образом: Platform Version = OpenCL 1.1
CUDA 4.2.1
SDK Revision = 7027912

Моя ОС Windows XP.

Сегодня 2012-07-17, и я думаю, что решил эту проблему.

  1. не использовать #include в исходном файле ядра.

  2. не используют линию сверхтонкой длины (например, вы пишете программу для генерации некоторых данных линии для исходного файла ядра) в исходном файле ядра.

ответ

1

Вы правы, это ничего не должно влиять.

Это не ваш реальный код, хотя, и я подозреваю, что эти времена выполнения, что ваше ядро ​​не просто. Возможно, вы подталкиваете своих местных жителей к некоторому пределу, что означает, что переменные должны храниться в некоторой более медленной памяти, которая подталкивает ваши временные ряды.

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

Чтобы проверить эту теорию, я попытаюсь удалить некоторые другие локальные структуры данных и посмотреть, имеет ли они такой же эффект. Все, что еще 8 байт или больше, должно иметь такой же эффект.


... конечно, возможно, вы обнаружили ошибку в реализации OpenCL, но это легко проверить. Просто скомпилируйте ядро ​​для другого устройства OpenCL, например. CPU. Это стоит делать так или иначе, потому что разные компиляторы выбирают разные проблемы.

Помимо этого, я думаю, вы вернулись к стандартным методам отладки.


КСТАТИ: в какой-то момент в вашем вопросе вы звоните массив abs[8], а не abc[8]. Я предполагаю, что это опечатка, но если это не так, это может быть вашей проблемой, так как имя abs столкнется с функцией abs(). Это может смутить глупый компилятор.

+0

спасибо. На самом деле, мой код корректно работает на процессоре с Intel и AMD OpenCL SDK. BTW, я использую abc [8], а не abs [8] (вы можете внимательно проверить мой вопрос). Нет опечатки. – jxj

+0

Вы писали: «Если я прокомментирую« char abs [8] », результат будет правильным». Я только что отредактировал его, чтобы исправить это. –

+0

О, действительно. Я прошу прощения. Это опечатка. В моем реальном коде это abc [8]. В любом случае это очень странно. – jxj

Смежные вопросы