首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CUDA没有像预期的那样工作?

CUDA没有像预期的那样工作?
EN

Stack Overflow用户
提问于 2012-03-28 11:45:32
回答 1查看 211关注 0票数 0

我已经编写了CUDA代码。

代码语言:javascript
运行
复制
unsigned long mask_buffer;
int s;
off_t p,

for(p=0;p!=5000;p++)
{
    for(s=start;s!=end;s++)
    {
        ref_off = *(((unsigned int*)(idx_base)) + p);

        if((int)(first_indexes[s-start_sequence] % 8 - ref_off % 8) < 0)
        {
            int shamt2 = (ref_off % 8 - first_indexes[s-start_sequence] % 8);
            mask_buffer = *((unsigned long *)(msk_base + (ref_off - first_indexes[s-start_sequence])/8)) >> shamt2;

            if( ( (*(unsigned long *)(seqmaskc + 16 * (s-start_sequence))) ^ mask_buffer ) << shamt2) 
                continue;
        }

        else if((int)(first_indexes[s-start_sequence] % 8 - ref_off % 8) == 0)
        {
            mask_buffer = *((unsigned long *)(msk_base + (ref_off)/8));

            if( (*(unsigned long *)(seqmaskc + 16 * (s-start_sequence)) ^ mask_buffer))
                continue;
        }

        else
        {
            int shamt2 = 8 - (first_indexes[s-start_sequence] % 8 - ref_off % 8);
            mask_buffer = *((unsigned long *)(msk_base + (ref_off/8- first_indexes[s-start_sequence]/8) - 1)) >> shamt2;

            if( ( (*(unsigned long *)(seqmaskc + 16 * (s-start_sequence))) ^ mask_buffer ) << shamt2) 
                continue;
        }

        int shamt = (ref_off % 4 - first_indexes[s-start_sequence] % 4) * 2;

        memcpy(reference_blk, ref_base + ref_off / 4 - first_indexes[s-start_sequence] / 4, sequence_bytes);

        for (rp = last_rp ; rp != (unsigned long *) reference_blk ; rp--) 
        {
            unsigned long tmp = ((*rp) & ((1 << shamt) - 1)) << (8 * sizeof(unsigned long) - shamt);
            *rp = (*rp >> shamt) | shifted_in;
            shifted_in = tmp;
        }

        *rp = (*rp >> shamt) | shifted_in;

        if (sequence_length & 0x3)
            reference_blk[sequence_length >> 2] &= (1 << ((sequence_length & 0x3) << 1)) - 1;

        for ( i = sequence_length >> 2 ; i & (SEQUENCE_ALIGN - 1) ; i++ )
            reference_blk[i] = 0;

        //-- instead of memcmp --//
        int v = 0;
        char *p1 = (char *)sequence;
        char *p2 = (char *)reference_blk;
        int tmp_asd = sequence_bytes;

        while(tmp_asd!=0)
        {
            v = *(p1++) - *(p2++);

            if(v!=0)
                break;

            tmp_asd--;
        }

        if(v == 0)
        {
            mat_count[s - (int)start_sequence]++;      /* Maintain count */
            mat_position[s - (int)start_sequence] = ref_off-first_indexes[s-start_sequence]; /* Record latest position */
        }

    }
}

这个for循环是我的代码的主要函数。但问题是变量"p“永远不会超过5或6。我的电脑上有GT530,我的CUDA驱动程序版本和运行时版本也是4.0。这段代码有什么问题?

EN

回答 1

Stack Overflow用户

发布于 2012-03-28 12:07:30

假设这确实是一个内核,正如您在编辑新代码之前发布的文章所宣称的那样,您不能在CUDA内核中调用标准的C库函数,如memcpy (您在代码中途就这样做了)。您只能在内核中调用__device__函数。因此,除非这是memcpy在CUDA中的重新实现,否则在内核中调用该函数是不会起作用的……

此外,如果您要尝试编写需要检查组中其他线程编写的结果的CUDA内核,如您在内核的内存比较部分中所做的那样,您将需要在代码中放置一些同步点,以便在开始检查这些线程的结果之前确保所有线程都达到了某个点。如果您正在尝试检查另一个块可能已写入主内存的内容,也有相应的同步原语,以确保任何先前线程块的结果都已写出到主内存中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9900855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档