Я пишу код для аппроксимации функции с использованием степенных рядов и хотел бы использовать инструкцию #pragma unroll и FMA, например:
__constant__ double coeff[5] = {1.0,2.0,3.0,4.0,5.0}; /* constant is fake here */
__device__ double some_function(double x) {
double y;
int i;
y = coeff[0];
#pragma unroll
for(i=1;i<5;i++) y = y*x + coeff[i];
return y;
}
Код будет скомпилирован в сборку следующим образом:
ld.const.f64 %fd33, [coeff];
ld.const.f64 %fd34, [coeff+8];
fma.rn.f64 %fd35, %fd33, %fd32, %fd34;
ld.const.f64 %fd36, [coeff+16];
fma.rn.f64 %fd37, %fd35, %fd32, %fd36;
ld.const.f64 %fd38, [coeff+24];
fma.rn.f64 %fd39, %fd37, %fd32, %fd38;
ld.const.f64 %fd40, [coeff+32];
fma.rn.f64 %fd41, %fd39, %fd32, %fd40;
Я хочу избежать использования постоянной памяти и использовать немедленное значение следующим образом:
mov.f64 %fd248, 0d3ED0EE258B7A8B04;
mov.f64 %fd249, 0d3EB1380B3AE80F1E;
fma.rn.f64 %fd250, %fd249, %fd247, %fd248;
mov.f64 %fd251, 0d3EF3B2669F02676F;
fma.rn.f64 %fd252, %fd250, %fd247, %fd251;
mov.f64 %fd253, 0d3F1745CBA9AB0956;
fma.rn.f64 %fd254, %fd252, %fd247, %fd253;
mov.f64 %fd255, 0d3F3C71C72D1B5154;
fma.rn.f64 %fd256, %fd254, %fd247, %fd255;
mov.f64 %fd257, 0d3F624924923BE72D;
fma.rn.f64 %fd258, %fd256, %fd247, %fd257;
mov.f64 %fd259, 0d3F8999999999A3C4;
fma.rn.f64 %fd260, %fd258, %fd247, %fd259;
mov.f64 %fd261, 0d3FB5555555555554;
fma.rn.f64 %fd262, %fd260, %fd247, %fd261;
Я знаю, что для этого можно использовать макрос #define
, но это очень неудобно, когда много коэффициентов.
Есть ли какой-либо модификатор типа данных C (или параметры компилятора), который мог бы преобразовать мой массив коэффициентов в немедленные значения вместо использования постоянной памяти?
Я пробовал, и это не работает для static double
, static __constant__ double
и static __device__ double
.
и мой последний вопрос: я думаю, использование немедленного значения должно быть быстрее, чем использование постоянной памяти?
DFMA R2, R4, c[0x3][0x0], R2; DFMA R2, R2, R4, c[0x3][0x10]; DFMA R2, R2, R4, c[0x3][0x18]; DFMA R4, R2, R4, c[0x3][0x20];
- person njuffa   schedule 20.01.2015