Я использую программное обеспечение 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, и я думаю, что решил эту проблему.
не использовать #include в исходном файле ядра.
не используют линию сверхтонкой длины (например, вы пишете программу для генерации некоторых данных линии для исходного файла ядра) в исходном файле ядра.
спасибо. На самом деле, мой код корректно работает на процессоре с Intel и AMD OpenCL SDK. BTW, я использую abc [8], а не abs [8] (вы можете внимательно проверить мой вопрос). Нет опечатки. – jxj
Вы писали: «Если я прокомментирую« char abs [8] », результат будет правильным». Я только что отредактировал его, чтобы исправить это. –
О, действительно. Я прошу прощения. Это опечатка. В моем реальном коде это abc [8]. В любом случае это очень странно. – jxj