这完全是一个假设的问题.
在下面的代码中,我正在执行计算,它将一个变量z作为指定为"nan"的值.与正常z值相比,主要计算会更慢(如z = 1.0)
float z = 0.0/0.0; // that means z is "nan"
float p = 50.0, q = 100.0, r = 150.0;
// main calculation Type 1
float c = ((x*100)+(y*100))/(x*100)+(y*100)+152*(p+q/r)+z;
Run Code Online (Sandbox Code Playgroud)
以下是显示具有正常z值的主要计算的示例
float z = 1.0; // normal value for z
float p = 50.0, q = 100.0, r = 150.0;
// main calculation Type 2
float c = ((x*100)+(y*100))/(x*100)+(y*100)+152*(p+q/r)+z;
Run Code Online (Sandbox Code Playgroud)
因此,哪一个较慢,类型1还是类型2?或者没有时差?在单次计算中,时间差可能不可见,但是,如果我们收集数百万个这样的方程,时间结果会如何变化?
任何形式的思想,逻辑或信息都将受到赞赏.
注意:目前我并不关心变量'c'的结果值;
在OpenCl的在线编译中,我们必须...
program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret);
Run Code Online (Sandbox Code Playgroud)
但是,对于离线创建opencl的程序。
program = clCreateProgramWithBinary(context, 1, &device_id, (const size_t *)&binary_size, (const unsigned char **)&binary_buf, &binary_status, &ret);
Run Code Online (Sandbox Code Playgroud)
其中binary_buf是...
fread(binary_buf, 1, MAX_BINARY_SIZE, fp);
Run Code Online (Sandbox Code Playgroud)
因此,在脱机编译中,我们可以跳过clBuildProgram步骤,从而使此步骤更快。(这种方法正确吗,我们可以一次又一次地重复使用该二进制文件来运行程序?)
所以,我的问题是如何创建opencl二进制文件,以便我可以跳过构建cl程序的步骤?
我有3个函数重载.重载函数中数据类型的优先级如何?
#include <iostream>
using namespace std;
void myfunc (int i) {
cout << "int" << endl;
}
void myfunc (double i) {
cout << "double" << endl;
}
void myfunc (float i) {
cout << "float" << endl;
}
int main () {
myfunc(1);
float x = 1.0;
myfunc(x);
myfunc(1.0);
myfunc(15.0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
int
float
double
double
Run Code Online (Sandbox Code Playgroud)
程序如何决定调用float还是double?
void local () {
int x = 100;
double *loc;
loc = (double *) malloc(sizeof(double)*100);
memset(rxnrun, 0x0, sizeof(double)*100);
// perform some operations
// free(loc);
return; // without doing free for loc variable
}
Run Code Online (Sandbox Code Playgroud)
在这里,我可以看到有什么问题,因为内存泄漏是loc变量.但是,变量x怎么样?如果我们在函数返回后保留变量x以及loc变量无人值守(非自由),那么两个变量获取的内存空间会发生什么?
他们(两个变量)还会获得空间吗?
我已经分离出一些彼此不同的函数,但需要在不同的工作项中并行运行.因此,当调用内核时,需要决定必须执行哪个函数.
void call_calc0() {
// code
}
void call_calc1() {
// code
}
void call_calc2() {
// code
}
void call_calc3() {
// code
}
__kernel void perform (__global double* A, __global double* B) {
int idx = get_global_id(0);
if (idx == 0) {
call_calc0();
} else if (idx == 1) {
call_calc1();
} else if (idx == 2) {
call_calc2();
} else if (idx == 3) {
call_calc3();
}
}
Run Code Online (Sandbox Code Playgroud)
如果有256/512个工作项,则此代码示例将不是正确的方法.我该如何优化呢?
struct st {
char *p;
int len;
};
Run Code Online (Sandbox Code Playgroud)
这是我需要写入二进制文件的结构,以及保存在中的字符串
char *p
我应该用字符数组数据编写一个二进制文件。写入二进制文件后。还应该能够从二进制文件中以相同的结构读取它。
我尝试使用 FSEEK_END 获取二进制大小,并根据文件大小执行 fread,但它没有保存字符串。请建议。任何帮助/建议/指示将不胜感激。
提前致谢。
示例代码:
struct st {
char *p;
int len;
};
struct st varr;
varr.len = 100;
varr.p = new char[gen];
strcpy(varr.p, "Hello World");
FILE *p;
p=fopen("address","wb");
fwrite(&varr,sizeof(struct st),1,p);
fclose(p);
Run Code Online (Sandbox Code Playgroud)
这将向我写入指向二进制文件的指针。但我想在这里写整个字符串,但重点是,它应该用一个 fwrite 完成。
计算浮动值
tclsh
% expr 0.2+0.2
0.4
% expr 0.2+0.1
0.30000000000000004
%
Run Code Online (Sandbox Code Playgroud)
为什么不0.3?
我错过了一些东西.提前致谢.
expr为4个字符(t,n,f,y)提供意外结果.如果你正在做进一步的计算.然后代码就破了.我不明白为什么会这样?
% expr (F)
F
% expr (F)*1
can't use non-numeric string as operand of "*"
Run Code Online (Sandbox Code Playgroud)
和,
% expr (t)
t
% expr (n)
n
% expr (f)
f
% expr (y)
y
Run Code Online (Sandbox Code Playgroud)
这是charcters的文件:t,n,f,y.没有这些字符命名的变量.它应标记未找到的变量或其他一些有效错误.我错过了什么吗?
以下代码是否并行调用所有4个内核,所有4个事件都将等待它们完成?
event1 = event2 = event3 = event4 = 0;
printf("sending enqueue task..\n");
clEnqueueTask(command_queue, calculate1, 0, NULL, &event1);
clEnqueueTask(command_queue, calculate2, 0, NULL, &event2);
clEnqueueTask(command_queue, calculate3, 0, NULL, &event3);
clEnqueueTask(command_queue, calculate4, 0, NULL, &event4);
printf("waiting after enquing task..\n");
clWaitForEvents(1, &event1);
clWaitForEvents(1, &event2);
clWaitForEvents(1, &event3);
clWaitForEvents(1, &event4);
Run Code Online (Sandbox Code Playgroud)
或者,它是执行调用所有内核并行的任务的正确方法吗?它甚至可能吗?我需要查看哪些设备信息才能确认相同内容?