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。上面的代码对你有用吗?