我想了解在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 2014-11-05 05:17:35
是的,我認爲cudagetlasterror在這種情況下應該給出錯誤 – krishna 2014-11-05 05:19:01
當你在每種情況下用'cuda-memcheck'運行測試代碼時會發生什麼? – 2014-11-05 11:07:48