作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一小段代码可以在 Nvidia 旧架构(Tesla T10 处理器)上完美运行,但不能在 Fermi(Tesla M2090)上运行
我了解到费米的行为略有不同。因此,不安全的代码可能会在旧架构上正常运行,而在 Fermi 上它会捕获错误。
但是我不知道怎么解决。
这是我的代码:
__global__
void exec (int *arr_ptr, int size, int *result) {int tx = threadIdx.x;
int ty = threadIdx.y;
*result = arr_ptr[-2];}
void run(int *arr_dev, int size, int *result) {
cudaStream_t stream = 0;
int *arr_ptr = arr_dev + 5;
dim3 threads(1,1,1);
dim3 grid (1,1);
exec<<<grid, threads, 0, stream>>>(arr_ptr, size, result);}
由于我正在访问 arr_ptr[-2]
,fermi 抛出 CUDA_EXCEPTION_10,设备非法地址
。但事实并非如此。地址合法。
谁能帮我解决这个问题。
我的驱动代码是
int main(){
int *arr;
int *arr_dev = NULL;
int result = 1;
arr = (int*)malloc(10*sizeof(int));
for(int i = 0; i < 10; i++)
arr[i] = i;
if(arr_dev == NULL)
{
cudaMalloc((void**)&arr_dev, 10);
cudaMemcpy(arr_dev, arr, 10*sizeof(int), cudaMemcpyHostToDevice);
}
run(arr_dev, 10, &result);
printf("%d \n", result);
return 0;
最佳答案
Fermi 卡在设备上有更好的内存保护,并且会检测越界条件,这似乎在旧卡上“有效”。使用 cuda-memchk(或 cuda-gdb 中的 cuda-memchk 模式)更好地处理问题。
编辑:
这是罪魁祸首:
cudaMalloc((void**)&arr_dev, 10);
应该是
cudaMalloc((void**)&arr_dev, 10*sizeof(int));
这将导致这段代码
int *arr_ptr = arr_dev + 5;
将指针传递给越界的设备。
关于CUDA:Fermi (Tesla M2090) 无故生成 CUDA_EXCEPTION_10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6512118/
我有一个小型 Java 11 示例,其中包含 JUnit 5 测试,结果如下: changed conditional boundary → SURVIVED 主类: public final cla
我是一名优秀的程序员,十分优秀!