gpt4 book ai didi

c++ - 是否可以在编译时检查是否包含枚举的语句

转载 作者:行者123 更新时间:2023-11-28 01:51:04 30 4
gpt4 key购买 nike

我正在编写一个“错误检查”函数,其唯一任务是检查单个 if 语句。该函数针对 7 种不同的错误类型进行了重载,但首先让我展示一下我的代码:

ErrorCheck.h:(整个文件)

#pragma once
#ifndef __ERROR_CHECK_H__
#define __ERROR_CHECK_H__
// Header does not #include <***> anything. For obvious reasons.

// The function:
template <typename T>
bool errchk(const T check, const char* file, unsigned int line, const char* from, const char* func);

// How To call it:
#define ERRCHK(_check) \
errchk(_check, __FILE__, __LINE__, __FUNC__, #_check)

#endif // !__ERROR_CHECK_H__

ErrorCheck.cpp:(简化版)

// Include:
#include <cuda.h>
#include <cuda_runtime_api.h>
#include <cufft.h>
#include <cublas.h>
#include <curand_kernel.h>
#include <cusolver_common.h>
#include "cusparse.h"
#include "ErrorCheck.h"

// Functions bellow are overloaded 7 times for every error type from headers included above
const char * getErrorName(const Type & error) { /* ... */ };
const char * getErrorString(const Type & error) { /* ... */ };

// The function:
template <typename T, T successValue>
bool errchk(const T check, const char* file, unsigned int line, const char* from, const char* func)
{
if (check != successValue) {
// Report Error
return true; // Error was found.
}
return false; // No error.
}

// Instantiations:
template bool errchk <bool > (const bool check, const char * file, unsigned int line, const char * from, const char * func);
template bool errchk <cudaError_t > (const cudaError_t check, const char * file, unsigned int line, const char * from, const char * func);
template bool errchk <cufftResult_t > (const cufftResult_t check, const char * file, unsigned int line, const char * from, const char * func);
template bool errchk <cublasStatus_t > (const cublasStatus_t check, const char * file, unsigned int line, const char * from, const char * func);
template bool errchk <curandStatus_t > (const curandStatus_t check, const char * file, unsigned int line, const char * from, const char * func);
template bool errchk <cusolverStatus_t> (const cusolverStatus_t check, const char * file, unsigned int line, const char * from, const char * func);
template bool errchk <cusparseStatus_t> (const cusparseStatus_t check, const char * file, unsigned int line, const char * from, const char * func);

问题:#1
是否可以优化 bool errchk <***> (***) 中的 if 语句?
我知道这个函数是要在运行时调用的,但如果我们再考虑一下,我们会发现我们正在比较两个枚举。因此,我们可以强制编译器检查 if 的所有可能结果吗?语句,然后在运行时运行正确的语句?

问题:#2
还需要优化吗??
随着#include <chrono> lib 我已经计算出当检测到“成功”值时,这段代码最多需要 40 纳秒。当检测到“错误”值时最多 400 毫秒。

最佳答案

Is it possible to optimize if statement inside bool errchk <***> (***)?

在某些情况下,编译器 可以,但您不行。您正在编写一个无法对 check 的值进行编译时假设的函数.但是,编译器可能会注意到您调用了 errchk(cudaSuccess, whatever, etc, etc)。 ;它可以选择inline函数,在这种情况下它可以注意到 if (check != successValue)始终为真,并简单地优化掉整个调用。

Does it even need to be optimized??

可能不会。如果您将此代码置于性能关键的紧密循环中,则应将其从循环中取出;如果你在别处有它,40 ns 也没什么大不了的。但是 - 你需要 profile你的代码知道你应该优化什么。不要浪费时间优化只占用一小部分执行时间的事情。

说到分析,CUDA 提供了一个 profiling facility也可用于主机端代码。您也可以考虑通过我的 C++ish wrappers 使用它对于 CUDA 运行时 API(here 是特定于分析的 API 包装器)。


PS:在我看来,您可能根本不应该编写 errchk 函数。您正在使用 C++,还记得吗?而不是这种可怕的宏和模板近亲繁殖 - 使用 exceptions ;您将不再需要记住在每次调用后检查返回值。异常还可以让您按类别区分错误类型;在错误中嵌套错误;使用多个数字等来表达错误信息。

关于c++ - 是否可以在编译时检查是否包含枚举的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43022981/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com