OpenCL,向量类型存在问题:叉积无法正常工作

时间:2019-05-30 17:51:00

标签: parallel-processing opencl gpgpu gpu-programming

我是 OpenCL 的新手,以及繁重的并行计算。我在向量类型上遇到了操作问题。 我为利用 SIMD 指令进行矢量和矩阵运算而感到疯狂。但是问题在于向量类型float float3可能无法正常工作... 事情很简单,我只需要对两个向量的叉积求函数即可。

我已经在Scala中编写了该函数的版本,并且运行良好。

这是Scala中的代码:

    @inline def crossProduct(other: Vector3D) = Vector3D(
        y * other.z - z * other.y,
        z * other.x - x * other.z,
        x * other.y - y * other.x)


这是OpenCL中的版本,并且未通过测试:

float3 cross_pro(float3 a, float3 b) {
    return (float3) (
        (a.y * b.z) - (a.z * b.y), 
        (a.z * b.x) - (a.x * b.z),
        (a.x * b.y) - (a.y * a.x));
}

给出一组参数:cross_pro((float3) (0, 1, 0), (float3) (1, 0, 0)); 在线计算器说结果必须为(float3) (0, 0, -1) 但OpenCL版本会打印:(float3) (0, 0, 0)!  我什至无法想象为什么会这样?所以我检查了此函数的重载,尝试了这些向量类型并做了很多其他的事情...

1 个答案:

答案 0 :(得分:2)

export class DashboardComponent implements OnInit {

  newsList:any=[];
  constructor(private router:Router, private newsService:NewsService, private customersService:CustomersService) { }

  ngOnInit() {
    this.loadAllNews();
    //this.loadAllCustomers();
  }

  loadAllNews(){
    this.newsService.getAllNews().subscribe(
      data=>{
        this.newsList=data;

      },
      error=>{
        if(error.status===401)
          this.router.navigate(['/login']);
        console.log("Desde el DashBoard"+ error);
      }

    );
  }

  loadAllCustomers(){
    this.customersService.getAllCustomer().subscribe(
      data=>{
        this.newsList=data;
      },
      error=>{
        console.log("Desde el DashBoard"+error);
      }

    );
  }


}

应该是

(a.x * b.y) - (a.y * a.x));

OpenCL也已经有交叉产品

https://www.khronos.org/registry/OpenCL/sdk/1.1/docs/man/xhtml/cross.html

(a.x * b.y) - (a.y * b.x));
  

说明

     

返回p0.xyz和p1.xyz的叉积。 w的w分量   float4结果(如果cl_khr_fp64或cl_khr_fp16为两倍或一半)   扩展名已启用)将为0.0。

如果您需要CPU的SIMD性能:我想,如果使用驱动程序的叉积函数定义,驱动程序将有效地处理任何可用的CPU叉积或类似点积的函数。