我是 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)
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)
!
我什至无法想象为什么会这样?所以我检查了此函数的重载,尝试了这些向量类型并做了很多其他的事情...
答案 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叉积或类似点积的函数。