我是并行编程的初学者.我有一个可能看起来很愚蠢的查询但是当我用Google搜索时我没有得到明确的答案.
在GPU计算中,存在一种设备,即GPU和主机,即CPU.我写了一个简单的hello world程序,它将在gpu上分配一些内存,将两个参数(比如src []和dest [])传递给内核,复制src字符串即Hello world到dest字符串并从gpu获取dest字符串主人.
是GPU读取字符串"src"还是CPU写入GPU?此外,当我们从GPU返回字符串时,GPU是写入CPU还是从GPU读取CPU?
在来回传输数据时,可能有四种可能性:CPU到GPU - CPU写入GPU - GPU读取形成CPU 2. GPU到CPU - GPU写入CPU - CPU从GPU读取
有人可以解释哪些是可能的,哪些不是?
我很好奇理解linux中的零除异常处理。当执行零除运算时,将生成陷阱,即将陷阱INT0发送到处理器,并最终将SIGFPE信号发送到执行该操作的进程。
如我所见,除零异常在trap_init()函数中注册为
set_trap_gate(0, ÷_error);
Run Code Online (Sandbox Code Playgroud)
我想详细了解一下,在INT0生成之前和SIGFPE发送到流程之前发生了什么?
我常常对sleep(),阻塞调用,抢占概念感到困惑.据我所知,抢占完全是由调度程序完成的,无论进程在做什么.除了进程处于某个关键部分或执行原子指令之外,调度程序可以根据调度算法抢占进程并将其放入等待进程列表中.
另一方面,sleep()调用调度程序在指定的时间间隔内阻塞它; 作为参数传递给sleep().
阻塞调用就像等待操作一样完成,如I/O操作,如磁盘读/写,来自其他设备的信号等.
有人能让我以更全面的方式向我解释这些工作,还是指出一些可靠的资源?谢谢.
我有一个带有CC 3.0的GPU,所以它应该支持16个并发内核.我通过循环clEnqueueNDRangeKernel 10次启动10个内核.我怎么知道内核正在并发执行?
我想到的一种方法是获取NDRangeKernel语句之前和之后的时间.我可能必须使用事件以确保内核的执行已完成.但我仍然认为循环将按顺序启动内核.有人可以帮我吗..
基本上我有两个GPU,我想在每个GPU上执行一些内核.我不希望GPU在同一个内核上工作,每个人都做一部分(我不知道这是否可行),以防万一我甚至不想看到这种行为.
我只是想确保两个设备都在运行.我已经为它们创建了上下文和命令队列.但是我看到只有一个内核被执行,这意味着只使用了一个设备.这就是我做到的...
cl_device_id *device;
cl_kernel *kernels;
...
// creating context.
context = clCreateContext(0, num_devices, device, NULL, NULL, &error);
...
// creating command queues for all kernels
for(int i = 0; i<num_kenrels; i++)
cmdQ[i] = clCreateCommandQueue(context, *device, 0, &error);
...
// enqueue kernels
error = clEnqueueNDRangeKernel(*cmdQ, *kernels, 2, 0, glbsize, 0, 0, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
我会走正确的路吗?