CUDA: невыровненный доступ к памяти не поддерживается: что мне не хватает?

Есть несколько вопросов похожих к этому, но в данном случае это немного странно; NVCC 3.1 это не нравится, но 3.2 и 4.0RC нравится;

float xtmp[MAT1];

for (i=0; i<MAT1; i++){
    xtmp[i]=x[p[i]]; //value that should be here
}

Где p передается по ссылке на функцию (int *p), поступающую из...

int p_pivot[MAT1],q_pivot[MAT1];

Чтобы добавить немного контекста, прежде чем p попадет в «верхнюю» функцию, они заполняются (для ясности я вырезаю столько нерелевантного кода, сколько могу)

...
for (i=0;i<MAT1;i++){
    ...
    p_pivot[i]=q_pivot[i]=i
    ...
}
...

Кроме того, единственными операциями на своде являются трехэтапные свопы с целочисленными временными значениями.

После того, как все это p_pivot передается в «верхнюю» функцию с помощью (&p_pivot[0])

Для тех, кто ищет более подробную информацию, код здесь и единственное изменение, которое необходимо для переключения между 3.2/ 4.0 на более раннюю версию — изменить cudaDeviceSynchronise(); в cudaThreadSynchronize();. Это мой грязный грязный экспериментальный код, поэтому, пожалуйста, не судите меня! :D

Как уже отмечалось, все вышеперечисленное отлично работает в более высоких версиях NVCC, и я работаю над тем, чтобы установить их на рассматриваемую машину, но мне было бы интересно посмотреть, что мне не хватает.

Это должно быть индексирование поиска в массиве, которое вызывает проблему, но я не понимаю, почему?


person Bolster    schedule 20.04.2011    source источник
comment
Итак, это ваши подпрограммы прямой и обратной подстановки, а p — это опорный вектор? Возможно, вам потребуется добавить немного больше контекста в код, чтобы понять, что может происходить. Я не помню каких-либо ошибок компилятора в nvOpen64 с прошлого года, которые могли бы вызвать это, но кто знает....   -  person talonmies    schedule 20.04.2011


Ответы (1)


Мне это кажется ошибкой компилятора. Это будет работать с nvcc 3.1 на 64-битных платформах:

float xtmp[MAT1];
//Swap rows (x=Px)
for (i=0; i<MAT1; i++){
    int idx = p[i];
    xtmp[i]=x[idx]; //value that should be here
}

Я предполагаю, что что-то в неявном преобразовании int в size_t ломается. Не работает ни с одной из новых версий CUDA, которые я пробовал.

person talonmies    schedule 20.04.2011
comment
Это исправление, которое я внедрил, но я заинтригован, когда это было изменено сейчас копаюсь в примечаниях к выпуску... - person Bolster; 20.04.2011
comment
Вы не получите полный манифест изменений из примечаний к выпуску. У NVIDIA есть частная база данных отслеживания ошибок для зарегистрированных разработчиков, и даже там вы не можете увидеть отчеты об ошибках всех остальных. Если вы найдете ошибку и сообщите о ней, они сообщат вам, когда она будет исправлена. Если кто-то другой нашел это и сообщил об этом, вы не будете знать. Это немного отстойно, но я понимаю, почему они это делают. - person talonmies; 20.04.2011
comment
Я был зарегистрирован в течение нескольких недель, и каждый раз, когда я что-то ищу, никаких результатов, лол. - person Bolster; 20.04.2011