Greetings,
I am trying to modify an old piece of code heavily using Thrust to work on streams, I have tried to modify the old code but I have ended up with an invalid resource handle error and this means that I am not passing the stream in a correct way and I am not able to spot it, could you guys help me out with it, as I really need another pair of eyes in this case:
(1) I have a class called TriComp,
(2) TriComp has a private member: const cudaStream_t* _stream;
(3) TriComp has no public constructor, but an init(const cudaStream_t* stream) function, init sets _stream
_stream = stream;
(4) In the main the following is done
cudaStream_t testStream;
cudaStreamCreate(&testStream);
TriComp triComp;
triComp.init(&testStream);
//...
triComp.compute();
(5)triComp.compute() calls cloudVec.copyFromHost( _input->cV, _stream);
(6)copyFromHost is this in another header file:
void copyFromHost( const thrust::host_vector< T >& inArr, const cudaStream_t* stream)
// I have only added stream related things
{
resize( inArr.size() );
thrust::copy(
thrust::cuda::par.on(*stream), //If I comment this one everything works fine, but only on the default stream
inArr.begin(), inArr.end(), begin() );
return;
}
Calling copyFromHost gives Invalid resource handle error, I am sure that I am doing something so very trivial and stupid but I cannot see it :/
Your help will be extremely appreciated. Best Regards,
I don’t think its likely that the problem lies in anything you’ve shown. I think it relates to something you haven’t shown or described. For instance if you are doing anything that is multi-GPU oriented, e.g. cudaSetDevice(), that could be relevant to stream usage. This error may occur in a multi-GPU setting where the stream used was not created associated to the current device. I’m not sure it could/would explain what you have shown, however.
Greetings,
I am using only a single GPU and choosing device #0.
const int deviceIdx = cutGetMaxGflopsDeviceId();
CudaSafeCall( cudaSetDevice( deviceIdx ) );
CudaSafeCall( cudaDeviceReset() );
Unlike the examples in https://devblogs.nvidia.com/cuda-pro-tip-always-set-current-device-avoid-multithreading-bugs/ currently I am not trying anything multithreaded.
If you wish I can share the project as it is an opensource one: https://we.tl/t-UD9Cql7vUC
I have also tried to set device where I try to use streams in desperation:
void copyFromHost( const thrust::host_vector< T >& inArr, const cudaStream_t* stream)
{
cudaSetDevice(0);
resize( inArr.size() );
thrust::copy(
thrust::cuda::par.on(*stream),
inArr.begin(), inArr.end(), begin() );
return;
}
Still the same exception, ( nvcuda.dll cuda_runtime.h : 210)
cudaDeviceReset wipes out all device context (state). Anything that was allocated or created on the device is gone.
So this won’t work:
void reset()
{
Point2HVec().swap( _input.pointVec ); //VD:Host get rid of App class
SegmentHVec().swap( _input.constraintVec ); //VD:Host
TriHVec().swap( _output.triVec );
TriOppHVec().swap( _output.triOppVec );
cudaDeviceReset();
return;
}
void run()
{
// Pick the best CUDA device
const int deviceIdx = cutGetMaxGflopsDeviceId();
CudaSafeCall( cudaSetDevice( deviceIdx ) );
CudaSafeCall( cudaDeviceReset() );
cudaStream_t testStream;
cudaStreamCreate(&testStream); // create a stream
GpuDel gpuDel;
for ( int i = 0; i < _runNum; ++i )
{
reset(); //implicit destruction of stream
Greetings,
Thank you for point that out, a colleague of mine has solved our issue.
- device reset is removed
- thrust::copy caused the same problems, it is changed with CUDA’s async memcpy, others worked properly
- raw pointers assigned to thrust host/device vectors
For now we have a working modification, thank you so much Mr. Crovella
Now all I need to figure out why thrust::copy has failed, but that is for another day
1 Like