Я пытаюсь узнать о динамическом распределении общей памяти в CUDA. Я написал одну простую программу, которая возвращает ошибку, используя cudaGetLastError. Я выделил общую память размером 100 целых элементов при запуске ядра. Я попытался получить доступ к 101-127 индексированным элементам памяти памяти и не обнаружил никаких ошибок, но в то время как 130-й элемент доступа предоставляет ошибку «неуказанный сбой запуска». Я считаю, что эта ошибка должна появиться и при доступе к элементу 101, потому что я выделил размер всего 100 элементов.Почему существует неопределенное поведение внешней памяти в CUDA?
#include <cuda.h>
#include <stdio.h>
__global__ void xyz(int offset)
{
extern __shared__ int array[];
array[101]=offset;
printf("%d\n", array[101]);
}
int main()
{
dim3 grid(1,1,1);
dim3 block(100,1,1);
int offset=50;
xyz<<<grid,block,sizeof(int)*100>>>(offset);
cudaDeviceSynchronize();
cudaError_t err=cudaGetLastError();
if(err!=cudaSuccess)
{
printf("Error is =%s\n",cudaGetErrorString(err));
}
return 0;
}
Итак, ваш вопрос можно суммировать как «почему неопределенное поведение неопределенно определенным образом»? Вероятно, это связано с гранулярностью распределения и дизайном аппаратного обеспечения, но зачем вам это нужно? – talonmies
Да, я думаю, cudagetlasterror должен дать ошибку в этом случае – krishna
Что происходит, когда вы запускаете свой тестовый код с 'cuda-memcheck' в каждом случае? –