我有简单的内核:
__kernel vecadd(__global const float *A,
__global const float *B,
__global float *C)
{
int idx = get_global_id(0);
C[idx] = A[idx] + B[idx];
}
Run Code Online (Sandbox Code Playgroud)
为什么当我将float更改为float4时,内核的运行速度会慢30%以上?
所有教程都说,使用矢量类型可加快计算速度......
在主机端,为float4参数分配的内存是16字节对齐,而clEnqueueNDRangeKernel的global_work_size是4倍.
内核运行在AMD HD5770 GPU,AMD-APP-SDK-v2.6上.
CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT的设备信息返回4.
编辑:
global_work_size = 1024*1024(及更高版本)
local_work_size = 256
使用CL_PROFILING_COMMAND_START和CL_PROFILING_COMMAND_END测量的时间.
对于较小的global_work_size(8196为浮点数/ 2048为浮动4),矢量化版本更快,但我想知道,为什么?
示例代码如下
Rust部分:
#[no_mangle]
pub extern fn call_c_function(value: i32, fun: fn(i32) -> i32) -> i32 {
fun(value)
}
Run Code Online (Sandbox Code Playgroud)
而C部分:
int32_t call_c_function(int32_t value, int32_t (*fun)(int32_t));
int32_t triple(int32_t x)
{
return x*3;
}
int main(int argc, char *argv[])
{
int32_t value = 3;
int32_t result = call_c_function(value, triple);
printf("%d tripled is %d\n", value, result);
call_c_function(0, NULL); // Crash here
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
当然第二次召唤call_c_function会崩溃.Rust编译器不会抱怨里面的不安全代码call_c_function,因为从生锈的角度来看这段代码是安全的.也不允许简单地写:
if !fun.is_null() {
fun(value)
}
Run Code Online (Sandbox Code Playgroud)
因为fun类型是fn(i32) -> i32(它不是指针).
所以我的问题是,如何call_c_function防止NULL指针解除引用?有没有办法检查从C传递的回调是否无效?
也许我必须改变 …