I would like to exchange data between the host and device while the device is performing a computation. I created a sample program to test the concept.
I found that when my device code contains a printf(“”); statement the codes executes as expected. However when I removed this line the host code is no longer able to see the updates from the device.
What am I doing wrong and is there a better method to accomplish this?
global void mykernel(volatile int* datav)
{
//Stops working when commented
printf(“”);
//Run the loop
do
{
int v = (*datav);
if (v % 2 == 1)
{
(*datav) += 1;
}
} while (true);
}
int main()
{
//Set the GPU device to use
cudaSetDevice(0);
cudaCheckErrors(“cudaSetDevice error”);
//Allow pinned memory so the host and device can share asynchronously
cudaSetDeviceFlags(cudaDeviceMapHost);
cudaCheckErrors("cudaSetDeviceFlags error");
//Allocate pinned memory (this exists on the host but is accessible by the device)
volatile int* d_data, * h_data;
cudaHostAlloc((void**)&h_data, sizeof(int), cudaHostAllocMapped);
cudaCheckErrors("cudaHostAlloc error");
//Connect the device to the pinned host memory
cudaHostGetDevicePointer((int**)&d_data, (void*)h_data, 0);
cudaCheckErrors("cudaHostGetDevicePointer error");
//Start the kernels
mykernel << <1, 1 >> > (d_data);
cudaCheckErrors("kernel fail");
//Loop
do
{
int value1 = (*h_data);
if (value1 % 2 == 0)
(*h_data) += 1;
} while (true);
//Synchronize the device
cudaDeviceSynchronize();
cudaCheckErrors("kernel fail 2");
//Free
cudaFreeHost((void*)h_data);
//Reset
cudaDeviceReset();
//Return
return 0;
}