我找到了"导入表"字段的指针.这是8字节大小,分为虚拟地址和大小.但是,虚拟地址字段中的值很大,并且误导了我提取与导入表相关的条目的下落相关信息的努力.值是否指向偏移量,如果是,则(.exe)文件在到达所需偏移量之前完成.
因此,我正在试着让一些代码在OpenCL中运行.
由于我没有得到最初的预期结果,我一直在尝试各种方法来弄清楚出了什么问题.所以我想出了下面附带的代码,并且在成功执行后它没有产生预期的结果.
此代码的最初愿景是执行指定数量的线程并将线程号复制到数组中.
Threads: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
然而,我得到的结果.
Threads: 0 0 0 3 0 0 0 7 0 0 0 11 0 0 0 15
Run Code Online (Sandbox Code Playgroud)
结果我得到了他们的模式.所以每一个
(n % 4)
Run Code Online (Sandbox Code Playgroud)
它似乎在我的数组中放了一个数字.我开始考虑是否由于某种原因将代码视为int并转换为char.
gcc main.c -o threadsopencl -std=c99 -framework OpenCL
#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif
#include <stdlib.h> // warning: implicit declaration of function ‘malloc’
#include <stdio.h> // …Run Code Online (Sandbox Code Playgroud) 我已经使用GDB一天了,我已经积累了很好的理解.但是,当我使用GDB和打印寄存器在最后一个分号设置断点时,我无法完全解释存储在XMM寄存器中的数据的含义.
我不知道数据是否为(MSB> LSB)格式,反之亦然.
__m128i S = _mm_load_si128((__m128i*)Array16Bytes);
}
Run Code Online (Sandbox Code Playgroud)
所以这就是我得到的结果.
(gdb) print $xmm0
$1 = {
v4_float = {1.2593182e-07, -4.1251766e-18, -5.43431603e-31, -2.73406277e-14},
v2_double = {4.6236050467459811e-58, -3.7422963639201271e-245},
v16_int8 = {52, 7, 55, -32, -94, -104, 49, 49, -115, 48, 90, -120, -88, -10, 67, 50},
v8_int16 = {13319, 14304, -23912, 12593, -29392, 23176, -22282, 17202},
v4_int32 = {872888288, -1567084239, -1926210936, -1460255950},
v2_int64 = {3749026652749312305, -8273012972482837710},
uint128 = 0x340737e0a29831318d305a88a8f64332
}
Run Code Online (Sandbox Code Playgroud)
那么有人会指导我如何解释数据.
我已经开始编写新的CUDA应用程序。但是我一路上走了个有趣的弯路。第一次在变量x上调用cudaMalloc失败。但是,当我第二次调用它时,它将返回cudaSuccess。最近升级到CUDA 4.0 SDK,这是一个非常奇怪的错误。
我什至进行了一些测试,看来cudaMalloc的第一个调用失败了。
我有一个字符串:
"quic"
传递给一个函数,其中构成字符串的位存储在无符号的__int64中.导致以下输出:
0111010001101000011001010010000001110001011101010110100101100011
但是,当我传递包含这些值的字符串时:
0xDE,0x10,0x9C,0x58,0xE8,0xA4,0xA6,0x30,'\ 0'
输出不如我预期的那样正确:
1111111111111111111111111111111111111111111111111010011000110000
我使用与第一个字符串相同的代码,其中包含:
(((unsigned __int64)Message [0])<< 56)| (((unsigned __int64)Message [1])<< 48)|
(((unsigned __int64)消息[2])<< 40)| (((unsigned __int64)Message [3])<< 32)|
(((unsigned __int64)Message [4])<< 24)| (((unsigned __int64)Message [5])<< 16)|
(((unsigned __int64)Message [6])<< 8)| (((unsigned __int64)Message [7]));
我一直在尝试分配一个可以被每个内核函数访问的变量.我的尝试是下面附带的代码,但它不会编译,因为内核无法访问dArray.在C++中,您可以将变量放在顶部,或者在整个程序中声明要在每个范围内访问的静态.
__global__ void StoreThreadNumber()
{
dArray[threadIdx.x] = threadIdx.x;
}
int main( int argc, char** argv)
{
unsigned __int8 Array[16] = { 0 };
unsigned __int8 dArray[16];
for( __int8 Position = 0; Position < 16; Position++)
cout << Array[Position] << " ";
cout << endl;
cudaMalloc((void**) dArray, 16*sizeof(__int8));
cudaMemcpy( dArray, Array, 16*sizeof(__int8), cudaMemcpyHostToDevice);
StoreThreadNumber<<<1, 16>>>();
cudaMemcpy( Array, dArray, 16*sizeof(__int8), cudaMemcpyDeviceToHost);
for( __int8 Position = 0; Position < 16; Position++)
cout << Array[Position] << " ";
cout << endl;
cudaFree(dArray);
}
Run Code Online (Sandbox Code Playgroud) 有一个32/64位的大整数,我正在修改几个位的位置.
风格1
Integer64 = Modify(Integer64);
Run Code Online (Sandbox Code Playgroud)
风格2
Modify(Integer64);
Run Code Online (Sandbox Code Playgroud)
风格3
Using the same style as the 1st, but inline function
Run Code Online (Sandbox Code Playgroud)
我也相信样式2更能描述代码中的特定步骤.
从执行角度来看,哪种方式最好?