主题中讨论的其他器件: TDA2
工具与软件:
您好!
我想知道在哪里可以找到有关 C66的 OpenCL 的文档、这些文档似乎并不是很有用、但我有以下问题:
- 与直接使用内在函数相比、是使用 OpenCL 吗?
- 使用 OpenCL 应该通过内在函数获得相同或更好的性能、还是会使性能恶化?
- 在哪里可以找到有关如何将其用于 C66的示例?
- 如何将数据正确加载到 floatn 数据类型并注意存储器对齐?
我曾尝试重写一些代码、但在某些情况下、输出似乎有所不同、这可能是由于内存对齐所致。
使用以下 测试代码:
void test_func (float * restrict in_ptr)
{
__float2_t vec_a、vec_b;
_float2_t vec_c =_ftof2 (0.0f、0.0f);
float test_in_1[]={0.678513、0.75461321};
悬空 TEST_IN_2[]={847.312.5684351.13};
float2 vec_af2、vec_BF2、vec_C2F;
printf("\n\n\test local array\n");
vec_a =_mem8_f2 (&test_in_1[0]);
vec_b =_mem8_f2 (&test_in_2[0]);
vec_c =_dmpysp (vec_a、vec_b);
vec_c =_daddsp (_dmpysp (vec_a、vec_b)、vec_c);
printf ("指针输入:%f %f %f %f\n\n"、TEST_IN_1[0]、TEST_IN_1[1]、TEST_IN_2[0]、TEST_IN_2[1]);
printf ("内在函数输入:%f %f\n"、_hif2 (vec_a)、_lof2 (vec_a));
printf ("内在函数输出:%f\n"、_hif2 (vec_c)+_lof2 (vec_c));
vec_af2 =*(float2*)(&test_in_1[0]);
VEC_BF2 =*(float2*)(&TEST_IN_2[0]);
vec_C2F = vec_af2 * vec_BF2;
vec_C2F += vec_af2 * vec_BF2;
printf ("OpenCL 输入:%f %f\n"、vec_af2.hi、vec_af2.lo);
printf ("OpenCL 输出:%f\n"、vec_C2F.hi + vec_C2F.lo);
printf("\n\n\test input pointer\n");
vec_a =_mem8_f2 (&in_ptr[0]);
vec_b =_mem8_f2 (&in_ptr[2]);
vec_c =_dmpysp (vec_a、vec_b);
vec_c =_daddsp (_dmpysp (vec_a、vec_b)、vec_c);
printf ("指针输入:%f %f %f %f\n\n"、in_ptr[0]、in_ptr[1]、in_ptr[2]、in_ptr[3]);
printf ("内在函数输入:%f %f %f\n"、_hif2 (vec_a)、_lof2 (vec_a)、_hif2 (vec_b)、_lof2 (vec_b));
printf ("内在函数输出:%f\n"、_hif2 (vec_c)+_lof2 (vec_c));
vec_af2 =*(float2*)(&in_ptr[0]);
VEC_BF2 =*(float2*)(&IN_ptr[2]);
vec_C2F = vec_af2 * vec_BF2;
vec_C2F += vec_af2 * vec_BF2;
printf ("OpenCL 输入:%f %f %f %f\n"、vec_af2.hi、vec_af2.lo、vec_Bf2.hi、vec_Bf2.lo);
printf ("OpenCL 输出:%f\n"、vec_C2F.hi + vec_C2F.lo);
}
其中 in_ptr 指向 const float in_data[]={……}内的某个位置
我得到以下结果:
[host][DSP1 ] 97.967547 s:测试本地阵列
[主机][DSP1 ] 97.967577 s:指针输入:0.678513 0.754613 847.312500 684351.125000
[主机][DSP1 ] 97.967608 s:
[HOST][DSP1 ] 97.967638 s:内部输入:0.754613 0.678513.
[主机][DSP1 ] 97.967669:内在函数输出:1033990.625000
[主机][DSP1 ] 97.967699 s:OpenCL 输入:0.754613 0.678513.
[host][DSP1 ] 97.967699 s:OpenCL 输出:1033990.625000
[主机][DSP1 ] 97.967730 s:
[主机][DSP1 ] 97.967730 s:
[HOST][DSP1 ] 97.967760:测试输入指针
[HOST][DSP1 ] 97.967791 s:指针输入:-0.000000 0.662687 0.932101 -0.000000
[主机][DSP1 ] 97.967821 s:
[主机][DSP1 ] 97.967821 s:内在函数输入:0.662687 -0.000000 -0.000000 0.932101
[主机][DSP1 ] 97.967852 s:内在函数输出:-0.000000
[HOST][DSP1 ] 97.967913 s:OpenCL 输入:-0.000000 0.294224 0.932101 0.662687
[host][DSP1 ] 97.967913 s:OpenCL 输出:0.389957
可以看出、使用本地数组时数据加载正确、但在测试输入指针中 、使用 OpenCL 的加载实际上移动了1个浮点位、例如0.294224是&IN_ptr[0]之前的浮点位、这会导致错误的输出。