gpt4 book ai didi

c - 编写 C 宏以在 CUDA 内核中使用

转载 作者:行者123 更新时间:2023-11-30 20:22:44 26 4
gpt4 key购买 nike

我在代码中有以下结构,并且它已经使用了很多次。因此,为了提高代码可读性并减少行数,我确实需要使用宏来代替它。我希望为其编写宏的部分如下:

#define _UNROLL_FACTOR_volIntGrad 32
int jj = 0;
for (; jj < (ngbSize - 32); jj += 32) {
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 32; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}

for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad / 2)); jj+= (_UNROLL_FACTOR_volIntGrad / 2)){
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 16; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}

for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad / 4)); jj+= (_UNROLL_FACTOR_volIntGrad / 4)){
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 8; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}

for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad / 8)); jj+= (_UNROLL_FACTOR_volIntGrad / 8)){
int j = offset + jj;

#pragma unroll
for (int k = 0; k < 4; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}

for (; jj < (ngbSize - (_UNROLL_FACTOR_volIntGrad / 16)); jj+= (_UNROLL_FACTOR_volIntGrad / 16)){
int j = offset + jj;
#pragma unroll
for (int k = 0; k < 2; k++){
...
arbitrary calculation 1 (depends on k)
...
}
...
arbitrary calculation 2
...
}
for (; jj < ngbSize; jj++){
int j = offset + jj;
...
arbitrary calculation 3
...
}
}

通过任意计算X,我的意思是一组独立于宏并且因功能而异的计算。有谁知道如何编写这个宏以减少上述结构的大小?例如如下所示:

__MACRO
arbitrary calculation 1
arbitrary calculation 2
arbitrary calculation 3
__END

最佳答案

在 C++ 中,除了包含防护和平台依赖项的条件编译之外,人们普遍不赞成将宏用于任何其他用途。最好的办法是创建一个静态常量,该常量将在内部链接并具有单点维护。您可以将其放在文件的顶部。

如果您使用的是 C++11,那么您可以使用 constexpr 来完成您想要执行的操作。编译器会知道您的语句具有类型而不仅仅是文本替换,这本质上是 C 风格宏的作用。

constexpr 的目的是创建一个可以在编译时计算的不可变对象(immutable对象),有点像静态常量。但它们的伟大之处在于您可以使用它们创建静态函数,因此这在您进行依赖于其他函数的计算的情况下非常有用。

在此处查看 constexpr 的用法: When should you use constexpr capability in C++11?

关于c - 编写 C 宏以在 CUDA 内核中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38792130/

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