Я хочу использовать CUDA Graph в своем проекте CUDA, но в Интернете не так много полных примеров. Итак, я напрямую обратился к официальному API для его реализации, но продолжаю сталкиваться с ошибкой сегментации. Не могли бы вы помочь мне взглянуть?
Чтобы лучше контролировать весь поток графа, я решил использовать API CUDA Graph вместо подхода захвата потока. Следующий код может напрямую воспроизвести проблему.
#include
#include
__global__ void mdl(int *n_out, const float *eigen_vals, int n) {
__shared__ float shm[8];
int tid = threadIdx.x;
float threshold;
if (tid < n) {
shm[tid] = eigen_vals[tid];
__syncthreads();
if (tid == (n-1)) {
threshold = shm[tid] * 0.01;
int count = 0;
for (int i = 0;i < n;++i) {
count += (shm >= threshold) ? 1 : 0;
}
*n_out = count;
}
}
}
int main() {
int *d_object_n;
cudaMalloc((void**)&d_object_n, sizeof(int));
cudaMemset(d_object_n, 0, sizeof(int));
thrust::device_vector d_eigen_values{1, 2, 3, 4, 5, 6, 7, 8};
int n_ant = 8;
cudaGraphNode_t nodeMDL;
cudaGraph_t m_graph;
cudaGraphExec_t m_graphExec;
cudaGraphCreate(&m_graph, 0);
cudaKernelNodeParams nodeMDL_param = {0};
nodeMDL_param.func = (void*)mdl;
nodeMDL_param.gridDim = dim3(1);
nodeMDL_param.blockDim = dim3(8);
nodeMDL_param.sharedMemBytes = 0;
nodeMDL_param.extra = nullptr;
void* args[] = { &d_object_n, (void*)(d_eigen_values.data().get()), &n_ant };
nodeMDL_param.kernelParams = args;
cudaError_t err = cudaGraphAddKernelNode(&nodeMDL, m_graph, nullptr, 0, &nodeMDL_param);
err = cudaGraphInstantiate(&m_graphExec, m_graph);
if (err != cudaSuccess) {
std::cerr
Подробнее здесь: https://stackoverflow.com/questions/790 ... rnelparams