-
Notifications
You must be signed in to change notification settings - Fork 15
Open
Description
cuGetProcAddress not implement
I encountered the aforementioned error, and I also tried to implement it myself, but was continuously unsuccessful.
If you have some spare time, could you help implement this function? Thank you very much.
server
// cuda.cc
void Cuda::DispatchCuGetProcAddress(CudaRequest* request, RenderResponse* response) {
CL_ASSERT(request->param_count == 5);
auto symbol = (const char*)CUDA_REQUEST_EXTEND(request);
CL_LOG("params1 :%s", symbol);
CL_LOG("params2 :%d", (int)request->params[2]);
CL_LOG("params3 :%d", (cuuint64_t)request->params[3]);
response->header.size = sizeof(void*) + sizeof(CUdriverProcAddressQueryResult);
response->data.resize(response->header.size);
void** fn = (void**)response->data.data();
CUdriverProcAddressQueryResult* ret = (CUdriverProcAddressQueryResult*)FIELD_OFFSET(fn);
response->header.result = cuGetProcAddress(symbol, bin, (int)request->params[2], (cuuint64_t)request->params[3], ret);
CL_LOG("-----");
CL_LOG("ret1: %d", fn);
CL_LOG("ret1: %d", *fn);
CL_LOG("ret2: %d", *ret);
}
---
void Cuda::Dispatch(WorkerItem* item) {
auto request = (CudaRequest*)item->request.data.data();
CL_LOG("call api=%s param_count=%d", GetCudaFunctionName(request->api_index), request->param_count);
CL_ASSERT(request->version == version_);
Render::Dispatch(item);
switch (request->api_index) {
case CUGETPROCADDRESS:
DispatchCuGetProcAddress(request, &item->response);
break;
...
...client
// render.cpp
CUresult Render::PrepareRequest(RenderRequest* request) {
auto cuda = (CudaRequest*)request->datas[0].data();
switch (cuda->api_index) {
case CUGETPROCADDRESS: {
auto symbol = (char*)cuda->params[0];
if (symbol) {
std::string_view name_sv(symbol, strlen(symbol) + 1);
request->header.size += (uint32_t)name_sv.size();
request->datas.emplace_back(std::move(name_sv));
}
break;
}
// -----
CUresult Render::HandleResponse(RenderRequest* request, RenderResponse* response) {
auto cuda = (CudaRequest*)request->datas[0].data();
auto result = (CUresult)response->header.result;
if (result != CUDA_SUCCESS) {
CL_ERROR("handle error for api=%s result=%d", GetCudaFunctionName(cuda->api_index), result);
goto end;
}
switch (cuda->api_index) {
case CUGETPROCADDRESS:
auto ret = (uint64_t*)response->data.data();
auto fn = (void*)ret[0];
auto size = (CUdriverProcAddressQueryResult)ret[1];
*(void**)cuda->params[1] = fn;
if (cuda->params[4]) {
*(CUdriverProcAddressQueryResult*)cuda->params[4] = size;
}
break;Metadata
Metadata
Assignees
Labels
No labels