Поскольку в C возможно индексировать отрицательное местоположение массива и go вне границ массива, этот код компилируется и «работает».
__global__ void do_something_bad(int * in_a){
in_a[-1] = 666; // assign a value to an out of bounds memory location
}
Я предполагаю, что приведенный выше код выполняет следующее (пожалуйста, дайте мне знать, если это предположение неверно):
GPU memory before:
[0x00 = usually unused memory][0x01= Start of in_a][0x02 = in_a] ....
GPU memory after:
[0x00 = 666][0x01= Start of in_a][0x02 = in_a] ....
Таким образом, в памяти перед значением массива in_a устанавливается значение. Эта память до in_a могла содержать другие важные данные, но когда я тестирую ее, она не содержит ничего важного и, таким образом, не дает мне ошибки или провала теста.
К вашему сведению: я использую pycuda и тестирую мой код как go.
Я стараюсь не создавать молчаливых непредсказуемых ошибок в результате вышеизложенного. Конечно, в реальном случае пример -1 был бы рассчитан, и я упростил код до той проблемы, которую хочу решить.
Как определить эту ошибку и вызвать обнаруживаемую проблему, которую тестирует мой модуль можно забрать?