Here is my code:
[codebox]#include <stdio.h>
#include <cuda_runtime_api.h>
define SAFE_CALL(call) do { \
cudaError_t err = call; \
if(err != cudaSuccess) { \
fprintf(stderr, “Cuda error in file ‘%s’ in line %i : %s.\n”, \
FILE, LINE, cudaGetErrorString(err) ); \
exit(1); \
} } while (0)
#define NUM_BYTES 2000000000
int main() {
unsigned char* host1;
unsigned char* host2;
unsigned char* host3;
unsigned char* host4;
unsigned char* device;
SAFE_CALL(cudaMallocHost((void**)(&host1),NUM_BYTES));
SAFE_CALL(cudaMallocHost((void**)(&host2),NUM_BYTES));
SAFE_CALL(cudaMallocHost((void**)(&host3),NUM_BYTES));
SAFE_CALL(cudaMallocHost((void**)(&host4),NUM_BYTES));
SAFE_CALL(cudaMalloc((void**)(&device),NUM_BYTES));
printf(“done mallocing\n”);
SAFE_CALL(cudaMemcpy(device,host4,NUM_BYTES,
cudaMemcpyHostToDevice));
printf(“done with program\n”);
}[/codebox]
Now, I’ve requested 2GB of memory 4 times, so obviously cudaMallocHost should fail at some point (I only have 3GB of memory total). If I compile this code in non-emulation mode (nvcc test.cu), I get the output “Cuda error in file ‘test.cu’ in line 21 : unknown error.”, followed by program termination, which is fine. However when I compile the code in emulation mode (nvcc -deviceemu test.cu), I get the output “done mallocing” followed by an abnormal program termination “a.exe has encountered a problem and needs to close… blah blah blah”. So the cudaMallocHost is not returning an error it seems. Am I missing something dumb? Otherwise, I guess this is (yet another) CUDA bug?