Почему у меня возникает ошибка «Выровненный доступ к памяти не поддерживается»? - PullRequest
0 голосов
/ 10 сентября 2010

Я получил сообщение «ошибка выравнивания доступа к памяти не поддерживается» и выполнил поиск в Google, но четких объяснений не было.Полное сообщение об ошибке:

/c:\cuda\include\math_functions_dbl_ptx1.h(1308): Error: Unaligned memory accesses not supported

Следующий код вызвал ошибку:

for (j = low; j <= high; j++)

Переменные j и high объявлены как int.Подобного рода ошибки встречались и раньше, но устранялись сами собой (я ничего не делал).

Кто-нибудь может объяснить этот вопрос?

1 Ответ

3 голосов
/ 10 сентября 2010

Теория

На многих машинах - но не на Intel IA32 или их родственниках - если вы хотите получить доступ к 2-байтовому количеству (целому числу), адрес должен быть четным, а не нечётным;если вы хотите получить 4-байтовое количество (целое число или число с плавающей запятой), адрес должен быть кратным 4 байтам;если вы хотите получить доступ к 8-байтовому количеству (целому или двойному), адрес должен быть кратным 8 байтам;и т. д.

Внешне, таким образом, ваш код пытается разыменовать указатель, биты которого установлены в младших разрядах, когда вы этого не должны.Например, одним из способов решения проблемы (в C) будет:

long l = 0x12345678;
void *v = (char *)&l + 1;
long *lp = v;
l = *lp;

К тому времени, как вы пройдете арифметику с указателем, адрес в lp не будет 4-байтовым (или8 байт) выровнен;это из-за +1.В последней строке будет указан невыровненный указатель доступа к памяти.

Практика

Поскольку вы не показывали объявления для своего кода, мы не можем быть уверены, что является причиной проблемы (хотя вы и говорите,j и high являются int переменными, без комментариев о low).Действительно, почти независимо от деклараций кажется маловероятным, что процитированный цикл for является источником проблемы.Это может быть код, близкий к этому, но, вероятно, это не та строка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...