小编lda*_*nko的帖子

OpenCL标量与矢量

我有简单的内核:

__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),矢量化版本更快,但我想知道,为什么?

gpu gpgpu opencl

6
推荐指数
1
解决办法
2710
查看次数

如何检查从C传递的函数指针是否为非NULL

示例代码如下

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传递的回调是否无效?

也许我必须改变 …

c ffi rust

6
推荐指数
1
解决办法
2066
查看次数

标签 统计

c ×1

ffi ×1

gpgpu ×1

gpu ×1

opencl ×1

rust ×1