我在Windows 10和CUDA 9.2上的GeForce 1080 Ti(Pascal)上运行玩具CUDA样本。
目标是测试cudaMemPrefetchAsync到CPU,因为它应该工作。
但是,我在此特定行上收到CUDA错误(无效设备序号)。
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cstdio>
#include <cstdlib>
void fill(int* a, int val, int N) {
for (int k = 0; k < N; ++k) {
a[k] = val;
}
}
__global__ void add(int* a, int* b, int N)
{
for (int i = threadIdx.x + blockIdx.x * blockDim.x; i < N; i += blockDim.x * gridDim.x) {
a[i] += b[i];
}
}
inline void check(cudaError_t err, const char* file, int line) {
if (err != cudaSuccess) {
::fprintf(stderr, "ERROR at %s[%d] : %s\n", file, line, cudaGetErrorString(err));
abort();
}
}
#define CUDA_CHECK(err) do { check(err, __FILE__, __LINE__); } while(0)
int main()
{
int deviceId;
CUDA_CHECK(cudaGetDevice(&deviceId));
const int N = 1024*1024*32;
int *a, *b;
CUDA_CHECK(cudaMallocManaged(&a, N * sizeof(int)));
CUDA_CHECK(cudaMallocManaged(&b, N * sizeof(int)));
CUDA_CHECK(cudaMemPrefetchAsync(a, N * sizeof(int), cudaCpuDeviceId)); // program breaks here
CUDA_CHECK(cudaMemPrefetchAsync(b, N * sizeof(int), cudaCpuDeviceId));
fill(a, 1, N);
fill(a, 2, N);
CUDA_CHECK(cudaMemPrefetchAsync(a, N * sizeof(int), deviceId));
CUDA_CHECK(cudaMemPrefetchAsync(b, N * sizeof(int), deviceId));
add<<<32, 256>>>(a, b, N);
CUDA_CHECK(cudaGetLastError());
CUDA_CHECK(cudaDeviceSynchronize());
return 0;
}
这是硬件/驱动程序/操作系统限制吗?我可以简单地忽略错误吗?
答案 0 :(得分:4)
这是硬件/驱动程序/操作系统限制吗?
是的,后者。引自documentation
具有SM架构6.x或更高版本的GPU(Pascal类或更新版本) 提供其他统一内存功能,例如按需页面 整个过程中概述的迁移和GPU内存超额预订 这个文件。请注意,目前这些功能仅支持 在Linux操作系统上。
目前Windows不支持异步页面迁移,以及当您尝试启用它时出现错误的原因。