Проблема с общей памятью при отладке - PullRequest
3 голосов
/ 16 июня 2011

Я пытаюсь использовать Nsight для отладки следующего кода:

__device__ void change(int shared[])
{
    if(threadIdx.x<10)
        shared[threadIdx.x]=threadIdx.x;
}
__global__ void MyK()
{
    int shared[10]; 
    change(shared);
    __syncthreads();
}

Я вызываю свое ядро ​​в основном методе так:

cudaSetDevice(1);
MyK<<<1,20>>>();

когда я ставлю перерывТочка до изменения (общая) Я вижу, что общий массив создан и его значения установлены в 0.
когда точка останова ставится после __syncthreads ();я получаю «не могу разрешить имя общего доступа» в отладчике.

я не могу передать свой общий массив другой функции устройства?

Ответы [ 3 ]

1 голос
/ 28 июня 2011

Причина, по которой вы видите «Невозможно разрешить имя общего доступа» в окне наблюдения за памятью, заключается в том, что общий массив оптимизируется компилятором, так как он вообще не используется какой-либо частью вашего ядра после изменения (shared) , Как и пользователь586831, упомянутый ранее, попробуйте вывести значение в качестве возвращаемого значения для функции вашего устройства.

Также в другой заметке, не уверен, действительно ли вы имели в виду массив «_ shared _» или ссылаетесь на массив по имени «shared». В любом случае, вы не используете общую память в своем коде выше. «int shared» - это обычный тип целочисленного массива. Вам необходимо указать квалификатор _ shared _, чтобы объявить разделяемую память. Например, extern _ расшарил _ расшарил [10]

0 голосов
/ 18 июня 2011

Вызов __syncthreads() для некоторых и не всех потоков может привести к взаимоблокировке. threadIdx.x < 10 звонки _syncthreads() Как упоминалось ранее, вы не используете общую память здесь. Компилятор умен, если вы не используете значение, после этого место в памяти может стать недействительным. Попробуйте вывести значение в качестве возвращаемого значения для функции вашего устройства. Должно работать нормально, особенно если вы перемещаете / удаляете __syncthreads().

0 голосов
/ 17 июня 2011

Это реальный код или вы пропустили _ _ shared _ _ в объявлении буфера?

Имейте также в виду, что функции _ _device _ _ встроены компилятором и что отладчик может остановиться только на каком-то этапе всего процесса. Попробуйте использовать ядро ​​из нескольких, по крайней мере, 16 или 32 потоков, иначе вы не работаете полный SP, и это может обмануть отладчик.

...