Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda CUPTI:向跟踪添加更多事件_Cuda - Fatal编程技术网

Cuda CUPTI:向跟踪添加更多事件

Cuda CUPTI:向跟踪添加更多事件,cuda,Cuda,我正在尝试跟踪CUDA程序中的3个计数器,如下所示: void * sampling_func(void *arg) { CUptiResult cuptiErr; CUpti_EventGroup eventGroup; CUpti_EventID gldrID, gldhitID, gldmissID; //eventId; size_t bytesRead; uint64_t eventVal; cuptiErr = cuptiSetEventCollection

我正在尝试跟踪CUDA程序中的3个计数器,如下所示:

void *
sampling_func(void *arg)
{
  CUptiResult cuptiErr;
  CUpti_EventGroup eventGroup;
  CUpti_EventID gldrID, gldhitID, gldmissID; //eventId;
  size_t bytesRead;
  uint64_t eventVal;

  cuptiErr = cuptiSetEventCollectionMode(context,
                                         CUPTI_EVENT_COLLECTION_MODE_CONTINUOUS);
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiSetEventCollectionMode");

  cuptiErr = cuptiEventGroupCreate(context, &eventGroup, 0);
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiEventGroupCreate");

  cuptiErr = cuptiEventGetIdFromName(device, gld_request, &gldrID); //"gld_request"
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiEventGetIdFromName");

  cuptiErr = cuptiEventGetIdFromName(device, l1_gld_hit, &gldhitID); //"l1_global_load_hit"
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiEventGetIdFromName");

  cuptiErr = cuptiEventGetIdFromName(device, l1_gld_miss, &gldmissID); //"l1_global_load_miss"
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiEventGetIdFromName");

  cuptiErr = cuptiEventGroupAddEvent(eventGroup, gldrID);
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiEventGroupAddEvent");

  cuptiErr = cuptiEventGroupAddEvent(eventGroup, gldhitID);
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiEventGroupAddEvent");

  cuptiErr = cuptiEventGroupAddEvent(eventGroup, gldmissID);
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiEventGroupAddEvent");

  cuptiErr = cuptiEventGroupEnable(eventGroup);
  CHECK_CUPTI_ERROR(cuptiErr, "cuptiEventGroupEnable");
虽然在运行时,我得到以下错误:

:Error CUPTI_ERROR_INVALID_EVENT_ID for CUPTI API function 'cuptiEventGroupAddEvent'.
这指向gldhitID对cuptiEventGroupAddEvent的发送调用。我尝试了各种组合,但似乎无法同时添加更多计数器,我认为不应该如此。同时,所有这些计数器一次只能工作一个

我正在使用CUDA compute compatibility 2.0设备

有什么建议吗?我做错了什么


顺便说一句,我下面是代码。

好的,所以问题是我正在查看的配置文件计数器:

gld_请求和l1_全局_加载_命中和l1_全局_加载_未命中属于不同的“域”。不幸的是,CUDA错误不是很具体


无论如何,一旦我为每个域创建了两个独立的事件组,问题就消失了。

好的,所以问题在于我正在研究的配置文件计数器:

gld_请求和l1_全局_加载_命中和l1_全局_加载_未命中属于不同的“域”。不幸的是,CUDA错误不是很具体

无论如何,一旦我为每个域创建了两个独立的事件组,问题就消失了。

CUPTI提供了cuptiEventGroupSetsCreate API,正是为了这个目的。您可以传入一个事件ID数组,并将事件组集作为输出

事件组集是事件组的集合,每个事件组都可以在单个过程中进行分析。这样,您就不必担心手动将事件ID排序到单独的事件组中

下面是一个简短的片段,让您大致了解如何使用事件组集:

CUpti_EventID eventIds[3];
cuptiEventGetIdFromName(device, "name_of_event_0", &eventIds[0]);
cuptiEventGetIdFromName(device, "name_of_event_1", &eventIds[1]);
cuptiEventGetIdFromName(device, "name_of_event_2", &eventIds[2]);

CUpti_EventGroupSets *sets = NULL;
cuptiEventGroupSetsCreate(context, sizeof(eventIds), eventIds, &sets);

// Iterate over each set
for (int i = 0; i < sets->numSets; i++) {
    // Iterate over each event group in the set
    for (int j = 0; j < sets->sets[i].numEventGroups; j++) {
        // Enable the event group
        cuptiEventGroupEnable(sets->sets[i].eventGroups[j]);
    }
}
CUPTI提供的CuptieventGroupSetCreate API正是为了实现这一目的。您可以传入一个事件ID数组,并将事件组集作为输出

事件组集是事件组的集合,每个事件组都可以在单个过程中进行分析。这样,您就不必担心手动将事件ID排序到单独的事件组中

下面是一个简短的片段,让您大致了解如何使用事件组集:

CUpti_EventID eventIds[3];
cuptiEventGetIdFromName(device, "name_of_event_0", &eventIds[0]);
cuptiEventGetIdFromName(device, "name_of_event_1", &eventIds[1]);
cuptiEventGetIdFromName(device, "name_of_event_2", &eventIds[2]);

CUpti_EventGroupSets *sets = NULL;
cuptiEventGroupSetsCreate(context, sizeof(eventIds), eventIds, &sets);

// Iterate over each set
for (int i = 0; i < sets->numSets; i++) {
    // Iterate over each event group in the set
    for (int j = 0; j < sets->sets[i].numEventGroups; j++) {
        // Enable the event group
        cuptiEventGroupEnable(sets->sets[i].eventGroups[j]);
    }
}

我相信问题在于sampling_func的参数,但我还不能确定它。我相信问题在于sampling_func的参数,但我还不能确定它。CUPTI提供的cuptiEventGroupSetsCreate API正是为了这个目的。您可以传入一个事件ID数组,并将事件组设置为输出。事件组集是事件组的集合,每个事件组都可以在单个过程中进行分析。这样,您就不必担心手动将事件ID排序到单独的事件组中。哦,我从来没有研究过这个问题。我喜欢stackoverflow points,但你的答案是正确的。把它作为一个单独的答案贴出来,我会接受的。如果可能的话,请更具描述性,因为它可能会帮助未来的读者。CUPTI文档有点难以理解。另外,我现在正在研究CUDA分析器。如果我在以后的问题中给你贴标签可以吗?作为答案发布。至于您的探查器问题,我将密切关注使用CUDA标记的问题,因此我将尽可能尝试回答它们。CUPTI提供的cuptiEventGroupSetsCreate API正是为了实现这一目的。您可以传入一个事件ID数组,并将事件组设置为输出。事件组集是事件组的集合,每个事件组都可以在单个过程中进行分析。这样,您就不必担心手动将事件ID排序到单独的事件组中。哦,我从来没有研究过这个问题。我喜欢stackoverflow points,但你的答案是正确的。把它作为一个单独的答案贴出来,我会接受的。如果可能的话,请更具描述性,因为它可能会帮助未来的读者。CUPTI文档有点难以理解。另外,我现在正在研究CUDA分析器。如果我在以后的问题中给你贴标签可以吗?作为答案发布。至于你的评测器问题,我会密切关注带有CUDA标签的问题,所以我会尽可能地回答它们。