在ArrayFire中使用带有double2数组的seq时降级为float2

时间:2013-02-28 10:17:54

标签: parallel-processing arrayfire

我正在使用以下使用ArrayFire库的测试代码。

void test_seq(const array& input, array& output, const int N)
{
    array test      = seq(0,N-1);                                         
    output          = input;
}

(for the moment `array test` has no role)

double2* test_CPU; test_CPU=(double2*)malloc(10*sizeof(double2));       
for (int k=0; k<10; k++) { test_CPU[k].x=2.; test_CPU[k].y=1.; }
array test_GPU(10, test_CPU);
array test_GPU_output = constant(0.,10, c64);
test_seq(test_GPU,test_GPU_output,10);
print(test_GPU_output);
try {
    double2 *CPU_test = test_GPU_output.host<double2>();
    printf("%f %f\n",CPU_test[0].x,CPU_test[0].y);
} catch (af::exception& e) {
fprintf(stderr, "%s\n", e.what()); 
}

并且所有内容都编译并正确运行。

然而,我将上述功能更改为

void test_seq(const array& input, array& output, const int N)
{
    array test      = seq(0,N-1);                                         
    output          = input * test;
}

我收到以下运行时错误消息

src / gena / gtypes.cpp:112:错误:从cuComplex类型的数组中请求cuDoubleComplex

如果,另一方面,我改变了行

double2 *CPU_test = test_GPU_output.host<double2>();

float2 *CPU_test = test_GPU_output.host<float2>();

一切都恢复正常。似乎有一个降级与使用seq连接的float2。如果我使用seq(0,N-1,f64)之类的东西(我甚至不知道ArrayFire是否允许它),上述问题不会消失。

如何保持double2处理并避免降级为float2

1 个答案:

答案 0 :(得分:0)

将seq转换为数组时,它将以单精度(float)存储。

目前在arrayfire中,涉及两个不同精度数组的操作规则是选择较低的精度。这就是input * test从双精度转换为单精度(因此float2)的原因。

现在的解决方案是在测试生成下面添加一行。

test = test.as(f64);

它会增加很少的开销,因为在必要之前不会生成数组。