Cuda 尝试启用CUPTI\u活动\u种类\u环境时出现CUPTI\u错误\u不兼容错误

Cuda 尝试启用CUPTI\u活动\u种类\u环境时出现CUPTI\u错误\u不兼容错误,cuda,Cuda,当我运行下面的示例时,我得到了上面的错误。我在几台机器上都试过了,但都出现了同样的错误。我已从活动\u跟踪\u异步复制了此内容。你知道这是怎么回事吗 #include <cuda.h> #include <cuda_runtime.h> #include <cupti.h> #include <stdio.h> #include <string.h> #define BUF_SIZE (32 * 1024) #define ALIG

当我运行下面的示例时,我得到了上面的错误。我在几台机器上都试过了,但都出现了同样的错误。我已从
活动\u跟踪\u异步
复制了此内容。你知道这是怎么回事吗

#include <cuda.h>
#include <cuda_runtime.h> 
#include <cupti.h>
#include <stdio.h>
#include <string.h>

#define BUF_SIZE (32 * 1024)
#define ALIGN_SIZE (8)
#define ALIGN_BUFFER(buffer, align)                                            \
(((uintptr_t) (buffer) & ((align)-1)) ? ((buffer) + (align) - ((uintptr_t) (buffer)  &
((align)-1))) : (buffer))
#define CUPTI_CALL(call)                                                \
do {                                                                  \
CUptiResult _status = call;                                         \
if (_status != CUPTI_SUCCESS) {                                     \
  const char *errstr;                                               \
  cuptiGetResultString(_status, &errstr);                           \
  fprintf(stderr, "%s:%d: error: function %s failed with error %s.\n", \
          __FILE__, __LINE__, #call, errstr);                       \
  exit(-1);                                                         \
}                                                                   \
} while (0)


const char *
getActivityPower(CUpti_ActivityEnvironmentKind kind)
{
    switch (kind) {
    case CUPTI_ACTIVITY_ENVIRONMENT_SPEED:
         return "SPEED";
    case CUPTI_ACTIVITY_ENVIRONMENT_TEMPERATURE:
         return "TEMPERATURE";
    case CUPTI_ACTIVITY_ENVIRONMENT_POWER:
         return "POWER";
    case CUPTI_ACTIVITY_ENVIRONMENT_COOLING:
         return "COOLING";
    default:
         break;
    }

    return "<unknown>";
}

static void
printActivity(CUpti_Activity *record)
{
    switch (record->kind)
    {
         case CUPTI_ACTIVITY_KIND_ENVIRONMENT:
         {
              CUpti_ActivityEnvironment *env= ( CUpti_ActivityEnvironment *) record;
              printf("POWER %s \n",
              getActivityPower(env->environmentKind)) ;
              break;
         }

         default:
              printf("  <unknown>\n");
              break;
    }
}


void CUPTIAPI bufferRequested(uint8_t **buffer, size_t *size, size_t *maxNumRecords)
{
     uint8_t *bfr = (uint8_t *) malloc(BUF_SIZE + ALIGN_SIZE);
     if (bfr == NULL) {
         printf("Error: out of memory\n");
         exit(-1);
     }

     *size = BUF_SIZE;
     *buffer = ALIGN_BUFFER(bfr, ALIGN_SIZE);
     *maxNumRecords = 0;
}

void CUPTIAPI bufferCompleted(CUcontext ctx, uint32_t streamId, uint8_t *buffer, size_t size, size_t validSize)
{
     CUptiResult status;
     CUpti_Activity *record = NULL;

     if (validSize > 0) {
       if (ctx == NULL) {
             printf("==== Starting dump for global ====\n");
       }
       else {
             printf("==== Starting dump for context %p, stream %u ====\n", ctx, streamId);
       }

       do {
          status = cuptiActivityGetNextRecord(buffer, validSize, &record);
          if (status == CUPTI_SUCCESS) {
              printActivity(record);
          }
          else if (status == CUPTI_ERROR_MAX_LIMIT_REACHED)
              break;
          else {
              CUPTI_CALL(status);
          }
       } while (1);

       // report any records dropped from the queue
       size_t dropped;
       CUPTI_CALL(cuptiActivityGetNumDroppedRecords(ctx, streamId, &dropped));
       if (dropped != 0) {
           printf("Dropped %u activity records\n", (unsigned int) dropped);
       }

       if (ctx == NULL) {
          printf("==== Finished dump for global ====\n");
       }
       else {
          printf("==== Finished dump for context %p, stream %u ====\n", ctx, streamId);
       }
    }

    free(buffer);
}


int
main(int argc, char *argv[])
{
     size_t attrValue = 0, attrValueSize = sizeof(size_t);

     CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_ENVIRONMENT));
     CUPTI_CALL(cuptiActivityRegisterCallbacks(bufferRequested, bufferCompleted));

     CUPTI_CALL(cuptiActivityGetAttribute(CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_SIZE, &attrValueSize, &attrValue));
     printf("%s = %llu\n", "CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_SIZE", (long long unsigned)attrValue);
     attrValue *= 2;
     CUPTI_CALL(cuptiActivitySetAttribute(CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_SIZE, &attrValueSize, &attrValue));

     CUPTI_CALL(cuptiActivityGetAttribute(CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_POOL_LIMIT, &attrValueSize, &attrValue));
     printf("%s = %llu\n", "CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_POOL_LIMIT", (long long unsigned)attrValue);
     attrValue *= 2;
     CUPTI_CALL(cuptiActivitySetAttribute(CUPTI_ACTIVITY_ATTR_DEVICE_BUFFER_POOL_LIMIT, &attrValueSize, &attrValue));


     return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义基本单位大小(32*1024)
#定义对齐大小(8)
#定义对齐\u缓冲区(缓冲区,对齐)\
((缓冲区)和((对齐)-1))?((缓冲区)+(对齐)-(缓冲区)&
((对齐)-1)):(缓冲区)
#定义CUPTI_调用(调用)\
做{\
CUptiResult_状态=呼叫\
如果(_status!=CUPTI_SUCCESS){\
常量字符*errstr\
cuptiGetResultString(_status,&errstr)\
fprintf(stderr,“%s:%d:错误:函数%s失败,错误为%s。\n”\
__文件,行,调用,errstr)\
出口(-1)\
}                                                                   \
}而(0)
常量字符*
getActivityPower(CUpti_ActivityEnvironment种类)
{
开关(种类){
案例CUPTI\u活动\u环境\u速度:
返回“速度”;
案例铜活动环境温度:
返回“温度”;
案例铜活动环境动力:
回归“权力”;
外壳铜活动环境冷却:
返回“冷却”;
违约:
打破
}
返回“”;
}
静态空隙
打印活动(铜活动*记录)
{
开关(记录->种类)
{
案例铜活动种类环境:
{
CUpti_ActivityEnvironment*环境=(CUpti_ActivityEnvironment*)记录;
printf(“电源%s\n”,
getActivityPower(环境->环境类);
打破
}
违约:
printf(“\n”);
打破
}
}
请求的无效CUPTIAPI缓冲区(uint8\u t**缓冲区、大小*size、大小*maxNumRecords)
{
uint8_t*bfr=(uint8_t*)malloc(基本尺寸+对齐尺寸);
如果(bfr==NULL){
printf(“错误:内存不足\n”);
出口(-1);
}
*尺寸=基本尺寸;
*缓冲区=对齐缓冲区(bfr,对齐大小);
*maxNumRecords=0;
}
无效CUPTIAPI缓冲区已完成(CUcontext ctx、uint32\u t streamId、uint8\u t*缓冲区、大小、大小有效大小)
{
CUptiResult状态;
CUpti_活动*记录=NULL;
如果(有效大小>0){
如果(ctx==NULL){
printf(“===开始全局转储===\n”);
}
否则{
printf(“===开始转储上下文%p,流%u====\n”,ctx,streamId);
}
做{
状态=cuptiActivityGetNextRecord(缓冲区、有效大小和记录);
如果(状态==CUPTI_成功){
印刷活动(记录);
}
否则,如果(状态==达到最大极限值时出现错误)
打破
否则{
CUPTI_呼叫(状态);
}
}而(1),;
//报告从队列中删除的任何记录
尺寸没有下降;
CUPTI_调用(cuptiActivityGetNumDroppedRecords(ctx、streamId和DROPED));
如果(已删除!=0){
printf(“已删除%u个活动记录,\n”,(未签名整数)已删除);
}
如果(ctx==NULL){
printf(“===全局的已完成转储===\n”);
}
否则{
printf(“===上下文%p、流%u====\n”、ctx、流ID的已完成转储);
}
}
自由(缓冲);
}
int
main(int argc,char*argv[])
{
size\u t attrValue=0,attrValueSize=sizeof(size\u t);
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_ENVIRONMENT));
CUPTI_调用(cuptiActivityRegisterCallbacks(bufferRequested,bufferCompleted));
CUPTI_调用(cuptiActivityGetAttribute(CUPTI_活动属性设备属性缓冲区大小和属性值大小和属性值));
printf(“%s=%llu\n”、“CUPTI\u活动\u属性\u设备\u缓冲区大小”、(长-长无符号)属性值);
属性值*=2;
CUPTI_调用(cuptiactivitystatAttribute(CUPTI_活动属性设备属性缓冲区大小和属性值大小和属性值));
CUPTI_调用(cuptiActivityGetAttribute(CUPTI_活动、属性、设备、缓冲区、池限制和属性值大小和属性值));
printf(“%s=%llu\n”、“CUPTI\u活动\u属性\u设备\u缓冲区\u池\u限制”,(长-长无符号)属性值);
属性值*=2;
CUPTI_调用(CUPTIActivityStatAttribute(CUPTI_活动、属性、设备、缓冲区、池限制和属性值大小和属性值));
返回0;
}

您需要创建CUDA设备上下文。加上

int count = 0;
cudaGetDeviceCount(&count);

在main()的开头,重新编译,错误就会消失。

您使用的CUDA版本是什么?@Talonmes CUDA 6。上面的代码对你有用吗?