Ctree Specializer用于循环索引进行计算,而不是实际的数组值

时间:2014-10-21 00:24:50

标签: python c code-generation

我实现了一个简单的Xor Reducer,但它无法返回适当的值。

Python代码(输入):

class LazySpecializedFunctionSubclass(LazySpecializedFunction):

    subconfig_type = namedtuple('subconfig',['dtype','ndim','shape','size','flags'])

    def __init__(self, py_ast = None):
        py_ast = py_ast or get_ast(self.kernel)
        super(LazySlimmy, self).__init__(py_ast)

    # [... other code ...]

    def points(self, inpt):
        iter = np.nditer(input, flags=['c_index'])
        while not iter.finished:
            yield iter.index
            iter.iternext()


class XorReduction(LazySpecializedFunctionSubclass):
    def kernel(self, inpt):
        '''
            Calculates the cumulative XOR of elements in inpt, equivalent to
            Reduce with XOR
        '''
        result = 0
        for point in self.points(inpt):  # self.points is defined in LazySpecializedFunctionSubclass
            result = point ^ result      # notice how 'point' here is the actual element in self.points(inpt), not the index
        return result

C代码(输出):

// <file: module.c>
void kernel(long* inpt, long* output) {
    long result = 0;
    for (int point = 0; point < 2; point ++) {
         result = point ^ result;   // Notice how it's using the index, point, not inpt[point]. 
    };
    * output = result;
};

任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是你以不同的方式使用点,在XorReduction内核方法中你迭代数组中的值,但是在生成的C代码中,你迭代数组的索引。因此,您的C代码xor减少是在索引上完成的。 生成的C函数看起来应该更像

// <file: module.c>
void kernel(long* inpt, long* output) {
    long result = 0;
    for (int point = 0; point < 2; point ++) {
         result = inpt[point] ^ result;  // you did not reference your input in the question
    };
    * output = result;
};