Asynchronous 将CUDA回调的异步副本排入队列-不允许?
该计划:Asynchronous 将CUDA回调的异步副本排入队列-不允许?,asynchronous,cuda,cuda-streams,Asynchronous,Cuda,Cuda Streams,该计划: #include <string> #include <stdexcept> struct buffers_t { void* host_buffer; void* device_buffer; }; void ensure_no_error(std::string message) { auto status = cudaGetLastError(); if (status != cudaSuccess) {
#include <string>
#include <stdexcept>
struct buffers_t {
void* host_buffer;
void* device_buffer;
};
void ensure_no_error(std::string message) {
auto status = cudaGetLastError();
if (status != cudaSuccess) {
throw std::runtime_error(message + ": " + cudaGetErrorString(status));
}
}
void my_callback(cudaStream_t stream, cudaError_t status, void* args) {
auto buffers = (buffers_t *) args;
cudaMemcpyAsync(
buffers->host_buffer, buffers->device_buffer,
1, cudaMemcpyDefault, stream);
ensure_no_error("after cudaMemcpyAsync");
}
int main() {
cudaStream_t stream;
cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking);
buffers_t buffers;
cudaMallocHost(&buffers.host_buffer, 1);
cudaMalloc(&buffers.device_buffer, 1);
cudaStreamAddCallback(stream, my_callback, &buffers, 0);
ensure_no_error("after enqueue callback");
cudaStreamSynchronize(stream);
ensure_no_error("after sync");
}
这有点奇怪,因为cudaMemcpyAsync
的API引用没有将cudaerrornotallowed
列为潜在错误之一。从回调调度异步复制是否真的有问题
注意:我的机器有GTX650TI(CC3.0)、CUDA9.0、Linux内核4.8.0、驱动程序384.59
从回调调度异步复制是否真的有问题
从流上回调:
回调不能(直接或间接地)进行CUDA API调用,因为如果进行这样的调用导致死锁,它可能会自行等待
从回调调度异步复制是否真的有问题
从流上回调:
回调不能(直接或间接地)进行CUDA API调用,因为如果进行这样的调用导致死锁,它可能会自行等待
谢谢,对不起,我错过了。事实上,如果调用是由异步保证的,那么这没有多大意义,但是好的。谢谢,对不起,我错过了。事实上,如果调用由异步保证,那么这没有多大意义,但是可以。
terminate called after throwing an instance of 'std::runtime_error'
what(): after cudaMemcpyAsync: operation not permitted
Aborted